1. 程式人生 > >Android學習第四課:Java程式碼實現XML佈局

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

	}
}