android在java程式碼中動態新增元件及相關佈局方法(LayoutParams)
阿新 • • 發佈:2019-01-26
一、前言
Android的介面佈局可以用兩種方法,一種是在xml中佈局,一種是在JAVA程式碼中實現介面的佈局。前者佈局是很方便的,但是對於需要動態的顯示介面,這個時候xml就缺少了一種靈活性。有一個需求:針對listView或者RecyclerView進行下拉重新整理和上拉載入更多的時候,我們頁面需要安卓qq那種:下拉重新整理的listView或者RecyclerView上面嵌上一個搜尋框。
專案中這個地方用的是listView,因此最簡單的方法可能就是在為元件繫結adapter之前,使用listView的addHeadView方法動態新增一個元件。
值得注意的是:addHeadView必須在為元件繫結adapter之前
二、java程式碼使用佈局
1.
TextView myTextView = new TextView(this);
myTextView.setText("我是搜尋框");
myTextView.setTextSize(15);
myTextView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
listView.addHeaderView(myTextView);
1.但是報錯LinearLayout.LayoutParams不能轉換為AbsListView.LayoutParams,當時寫成 LinearLayout.LayoutParams就是憑感覺猜的。
2. 一般的佈局比如 LinearLayout和RelativeLayout程式碼中佈局除了setLayoutParams還有一種方法void addView(View, LayoutParams)
於是將LinearLayout.LayoutParams改成AbsListView.LayoutParams,但是發現後者只有建構函式中只有兩個引數,分別是width和height。這樣從執行結果來看這個textview只能靠在左邊。我要的效果是該textview在listview的item中居中,就像上面的那幅圖片中搜尋
-
由於使用了listView的原因,我們LayoutParams只能是AbsListView.LayoutParams。對元件設定AbsListView.LayoutParams只有構造引數中提供的寬高,這是無法自由佈局的。比如控制居中。
我們可以換個思路。我們在放入listView的item變成TextView外面套一層佈局。在該佈局(search_refresh_layout.xml)中我們可以自由控制TextView的顯示:居中、padding之類的。對該佈局設定AbsListView.LayoutParams: rl_tv_search.setLayoutParams(params);就ok了。程式碼如下:
ViewGroup rl_tv_search = (ViewGroup) LayoutInflater.from(this).inflate(R.layout.search_refresh_layout,null);
AbsListView.LayoutParams params = new AbsListView.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT,RelativeLayout.LayoutParams.WRAP_CONTENT);
rl_tv_search.setLayoutParams(params);
listView.addHeaderView(rl_tv_search);
listView.setAdapter(adapter);
其中search_refresh_layout.xml中
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="15sp"
android:text="我是搜尋框"
android:paddingTop="10dp"
android:paddingBottom="10dp"
android:layout_centerHorizontal="true"/>
</RelativeLayout>
效果圖如下:
之前的這個我是搜尋框是靠左邊的,現在居中
三、總結
- java程式碼中兩種設定佈局的方法,一種是setLayoutParams,另外一種是addView(View, LayoutParams)前者是通用的,後者是ViewGroup才有的,因為addView嗎只有group才可以。
- listView的addHeadView方法必須在為元件繫結adapter之前
- lsitView新增的頭部自由佈局還是巢狀一層LinearLayout之類的佈局,比較方便。