android編程之代碼佈局(一)

原文鏈接:http://blog.csdn.net/xyz_fly/article/details/7498205

前言:

習慣了用xml來寫佈局的,再用代碼來寫佈局,恐怕會很類。但畢竟有時候,我們還是需要用到代碼來寫佈局。
代碼佈局與xml佈局有很多相似點,在大多數方法上都可以直接用,只有個別方法的寫法不太一樣,接下來,我將分幾篇來介紹常用的幾種控件。

Android工程自帶的main.xml爲例,看看代碼是如何實現的

一、設置當前佈局
關於這個問題只針對初級水平的人員,其他人可略過。

我們知道,在初建一個activity的時候,程序會幫我們建好:

  1. protected void onCreate(Bundle savedInstanceState) {  
  2.     super.onCreate(savedInstanceState);  
  3.     setContentView(R.layout.main);  
  4. }  
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
	}

setContentView(R.layout.main);就是設置當前佈局的樣式。
我們用代碼寫佈局的話,這裏就要傳入一個View對象。實際上它就是線性佈局,相對佈局,文本框等的對象。比如我們創建了一個線性佈局,那麼我們這裏就將它的傳進去,例如:

  1. LinearLayout mLinearLayout = new LinearLayout(this);  
  2. setContentView(mLinearLayout);  
		LinearLayout mLinearLayout = new LinearLayout(this);
		setContentView(mLinearLayout);

二、線性佈局

線性佈局是我們經常使用的,我們先從它入手來熟悉代碼佈局。

  1. // 創建LinearLayout對象  
  2. LinearLayout mLinearLayout = new LinearLayout(this);  
  3.   
  4. // 建立佈局樣式寬和高,對應xml佈局中:  
  5. // android:layout_width="fill_parent"  
  6. // android:layout_height="fill_parent"  
  7. mLinearLayout.setLayoutParams(new LinearLayout.LayoutParams(  
  8.         LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));  
  9.   
  10. // 設置方向,對應xml佈局中:  
  11. // android:orientation="vertical"  
  12. mLinearLayout.setOrientation(LinearLayout.VERTICAL);  
		// 創建LinearLayout對象
		LinearLayout mLinearLayout = new LinearLayout(this);

		// 建立佈局樣式寬和高,對應xml佈局中:
		// android:layout_width="fill_parent"
		// android:layout_height="fill_parent"
		mLinearLayout.setLayoutParams(new LinearLayout.LayoutParams(
				LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));

		// 設置方向,對應xml佈局中:
		// android:orientation="vertical"
		mLinearLayout.setOrientation(LinearLayout.VERTICAL);

LayoutParams是有很多種的,如果你不熟悉的話,最好在前面加上LinearLayout,以便於你識別。

這樣,我們就最簡單的建立一個外層佈局,接下來,我們將實現TextView。

三、TextView

  1. // 創建TextView對象  
  2. TextView mTextView = new TextView(this);  
  3. // 設置文字  
  4. mTextView.setText("hello world");  
  5.   
  6. // 爲其建立佈局樣式,對應xml佈局中:  
  7. // android:layout_width="fill_parent"  
  8. // android:layout_height="wrap_content"  
  9. LinearLayout.LayoutParams mLayoutParams = new LinearLayout.LayoutParams(  
  10.         LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);  
  11.   
  12. // 在父類佈局中添加它,及佈局樣式  
  13. mLinearLayout.addView(mTextView, mLayoutParams);  
		// 創建TextView對象
		TextView mTextView = new TextView(this);
		// 設置文字
		mTextView.setText("hello world");

		// 爲其建立佈局樣式,對應xml佈局中:
		// android:layout_width="fill_parent"
		// android:layout_height="wrap_content"
		LinearLayout.LayoutParams mLayoutParams = new LinearLayout.LayoutParams(
				LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);

		// 在父類佈局中添加它,及佈局樣式
		mLinearLayout.addView(mTextView, mLayoutParams);

這裏爲其設置的佈局樣式與父類不同,你可以理解爲,它設置的佈局樣式並不是爲自己設置的,而是要告訴父類,我要擺放在什麼位置上。理解這一點很關鍵,因爲它是設置組件位置的關鍵!

它還有很多其他的參數設置:
mTextView.setTextColor(-1);//字體顏色
mTextView.setTextSize(16);//字體大小


最後:如果代碼沒有錯誤的話,運行起來和運行xml是一樣的。

下面是完整版代碼:

  1. public class TestLayout extends BaseActivity {  
  2.   
  3.     @Override  
  4.     protected void initRecourse() {  
  5.         // TODO Auto-generated method stub  
  6.   
  7.     }  
  8.   
  9.     @Override  
  10.     protected void initData() {  
  11.         // TODO Auto-generated method stub  
  12.   
  13.     }  
  14.   
  15.     @Override  
  16.     protected ViewGroup initView() {  
  17.         // 創建LinearLayout對象  
  18.         LinearLayout mLinearLayout = new LinearLayout(this);  
  19.   
  20.         // 建立佈局樣式寬和高,對應xml佈局中:  
  21.         // android:layout_width="fill_parent"  
  22.         // android:layout_height="fill_parent"  
  23.         mLinearLayout.setLayoutParams(new LinearLayout.LayoutParams(  
  24.                 LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));  
  25.   
  26.         // 設置方向,對應xml佈局中:  
  27.         // android:orientation="vertical"  
  28.         mLinearLayout.setOrientation(LinearLayout.VERTICAL);  
  29.   
  30.         // 創建TextView對象  
  31.         TextView mTextView = new TextView(this);  
  32.         // 設置文字  
  33.         mTextView.setText("hello world");  
  34.   
  35.         // 爲其建立佈局樣式,對應xml佈局中:  
  36.         // android:layout_width="fill_parent"  
  37.         // android:layout_height="wrap_content"  
  38.         LinearLayout.LayoutParams mLayoutParams = new LinearLayout.LayoutParams(  
  39.                 LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);  
  40.   
  41.         // 在父類佈局中添加它,及佈局樣式  
  42.         mLinearLayout.addView(mTextView, mLayoutParams);  
  43.   
  44.         return mLinearLayout;  
  45.     }  
  46. }  
public class TestLayout extends BaseActivity {

	@Override
	protected void initRecourse() {
		// TODO Auto-generated method stub

	}

	@Override
	protected void initData() {
		// TODO Auto-generated method stub

	}

	@Override
	protected ViewGroup initView() {
		// 創建LinearLayout對象
		LinearLayout mLinearLayout = new LinearLayout(this);

		// 建立佈局樣式寬和高,對應xml佈局中:
		// android:layout_width="fill_parent"
		// android:layout_height="fill_parent"
		mLinearLayout.setLayoutParams(new LinearLayout.LayoutParams(
				LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));

		// 設置方向,對應xml佈局中:
		// android:orientation="vertical"
		mLinearLayout.setOrientation(LinearLayout.VERTICAL);

		// 創建TextView對象
		TextView mTextView = new TextView(this);
		// 設置文字
		mTextView.setText("hello world");

		// 爲其建立佈局樣式,對應xml佈局中:
		// android:layout_width="fill_parent"
		// android:layout_height="wrap_content"
		LinearLayout.LayoutParams mLayoutParams = new LinearLayout.LayoutParams(
				LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);

		// 在父類佈局中添加它,及佈局樣式
		mLinearLayout.addView(mTextView, mLayoutParams);

		return mLinearLayout;
	}
}


附:重寫的activity
這裏的重寫activity是爲了更好爲我們編寫代碼佈局服務,在以後的代碼範例中,都會採用下面繼承該類方式。

  1. public abstract class BaseActivity extends Activity {  
  2.   
  3.     public Handler handler;  
  4.   
  5.     /** 初始化數據 */  
  6.     protected abstract void initData();  
  7.   
  8.     /** 初始化資源 */  
  9.     protected abstract void initRecourse();  
  10.   
  11.     /** 初始化界面 */  
  12.     protected abstract View initView();  
  13.   
  14.     /** 處理handler回傳的信息 */  
  15.     public void dispatchMessage(Message msg) {  
  16.     }  
  17.   
  18.     protected void onCreate(Bundle savedInstanceState) {  
  19.         super.onCreate(savedInstanceState);  
  20.   
  21.         requestWindowFeature(Window.FEATURE_NO_TITLE);  
  22.         setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);  
  23.   
  24.         initData();  
  25.   
  26.         initRecourse();  
  27.   
  28.         setContentView(initView());  
  29.   
  30.         handler = new Handler() {  
  31.             public void dispatchMessage(Message msg) {  
  32.                 BaseActivity.this.dispatchMessage(msg);  
  33.             }  
  34.         };  
  35.     }  
  36. }  
public abstract class BaseActivity extends Activity {

	public Handler handler;

	/** 初始化數據 */
	protected abstract void initData();

	/** 初始化資源 */
	protected abstract void initRecourse();

	/** 初始化界面 */
	protected abstract View initView();

	/** 處理handler回傳的信息 */
	public void dispatchMessage(Message msg) {
	}

	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

		initData();

		initRecourse();

		setContentView(initView());

		handler = new Handler() {
			public void dispatchMessage(Message msg) {
				BaseActivity.this.dispatchMessage(msg);
			}
		};
	}
}

注意:這裏的資源加載一般是從asset中加載進來的


android編程之代碼佈局(一)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章