Android學習第四課:Java程式碼實現XML佈局
權重屬性layout_height
在佈局控制元件中(如LinearLayout),子控制元件可以根據權重值(預設為0)來分配所佔據的空間,這需要結合layout_width或layout_height的值進行分類:
1)如果子控制元件layout_weight都為“match_parent”(子控制元件都“爭取”),控制元件根據權重值反比分配空間;
2)如果子控制元件layout_weight都為0dip(子控制元件都“謙讓”),根據權重值的正比分配空間;
3)如果有子控制元件的權重為0,則權重值表示填充順序而非比例關係;
第(3)種情況的一個佈局例子如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" > <EditText android:layout_width="<span style="color:#ff0000;">match_parent</span>" android:layout_height="wrap_content" android:hint="輸入關鍵字" android:layout_weight="1" /> <Button android:layout_width="<span style="color:#ff0000;">wrap_content</span>" android:layout_height="wrap_content" android:text="搜尋" android:layout_weight="0" /> </LinearLayout>
顯示截圖如下:
控制元件(View)屬性
在XML佈局檔案中,任何一個控制元件(如Button)都有很多屬性,為配置佈局檔案帶來極大困難和迷惑,實際上,任何一個控制元件的屬性都由兩部分組成,一個是控制元件自帶的屬性,這個事固定的,一個是控制元件相對於父容器(ViewsGroup)的屬性,這個因父容器的不同而變化,具體而言:
1)自帶的屬性,比如layout_width,layout_height
2)相對於父容器(ViewsGroup),比如在linearLayout中,子控制元件有layout_weight屬性,而在RelativeLayout中,沒有該屬性,這些屬性是通過父容器的LayoutParams進行管理。
Java語言實現佈局檔案(XML)檢視
通過設定佈局檔案中ViewGroup和View的屬性,可以形成各種各樣的檢視,但XML是一種標記語言,Android並不能直接執行,而是通過Layoutinflate類解析XML檔案,並根據XML中的ViewGroup、View建立ViewGroup、View的Java類例項,這些類的例項屬性值就是XML中設定的屬性值,即XML語言標記的檢視,可以通過Java語言同等實現。
以下是一個Demo,實現上面的檢視:
package com.example.javaimplementxml; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; import android.view.ViewGroup.LayoutParams; import android.widget.Button; import android.widget.EditText; import android.widget.LinearLayout; public class MainActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // setContentView(R.layout.activity_main); // 根目錄LinearLayout相對於外面仍然是子檢視 LinearLayout ll = new LinearLayout(this);// 新建容器 LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); ll.setLayoutParams(lp); // 新建LinearLayout的子控制元件EditText,並設定屬性 EditText et = new EditText(this); et.setHint("輸入搜尋關鍵字"); //EditText自有屬性 //EditText相對於LinearLayout的屬性 LinearLayout.LayoutParams lpet = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT, 1); et.setLayoutParams(lpet); ll.addView(et, 0); // 新建LinearLayout的子控制元件Button,並設定屬性 Button bt = new Button(this); bt.setText("搜尋"); //Button自有屬性 //Button相對於LinearLayout的屬性 LinearLayout.LayoutParams lpbt = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT, 0); bt.setLayoutParams(lpbt); ll.addView(bt, 1); setContentView(ll);//setContentView的引數,或者是資源ID,或者是View } }