1. 程式人生 > >android在java程式碼中動態新增元件及相關佈局方法(LayoutParams)

android在java程式碼中動態新增元件及相關佈局方法(LayoutParams)

一、前言

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中居中,就像上面的那幅圖片中搜尋

那樣。


  1. 由於使用了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>

效果圖如下:
親,重新整理試試

之前的這個我是搜尋框是靠左邊的,現在居中

三、總結

  1. java程式碼中兩種設定佈局的方法,一種是setLayoutParams,另外一種是addView(View, LayoutParams)前者是通用的,後者是ViewGroup才有的,因為addView嗎只有group才可以。
  2. listView的addHeadView方法必須在為元件繫結adapter之前
  3. lsitView新增的頭部自由佈局還是巢狀一層LinearLayout之類的佈局,比較方便。