前言:
習慣了用xml來寫佈局的,再用代碼來寫佈局,恐怕會很類。但畢竟有時候,我們還是需要用到代碼來寫佈局。
代碼佈局與xml佈局有很多相似點,在大多數方法上都可以直接用,只有個別方法的寫法不太一樣,接下來,我將分幾篇來介紹常用的幾種控件。
以Android工程自帶的main.xml爲例,看看代碼是如何實現的
一、設置當前佈局
關於這個問題只針對初級水平的人員,其他人可略過。
我們知道,在初建一個activity的時候,程序會幫我們建好:
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- }
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
setContentView(R.layout.main);就是設置當前佈局的樣式。
我們用代碼寫佈局的話,這裏就要傳入一個View對象。實際上它就是線性佈局,相對佈局,文本框等的對象。比如我們創建了一個線性佈局,那麼我們這裏就將它的傳進去,例如:
- LinearLayout mLinearLayout = new LinearLayout(this);
- setContentView(mLinearLayout);
LinearLayout mLinearLayout = new LinearLayout(this);
setContentView(mLinearLayout);
二、線性佈局 線性佈局是我們經常使用的,我們先從它入手來熟悉代碼佈局。
- // 創建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);
// 創建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
- // 創建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);
// 創建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是一樣的。
下面是完整版代碼:
- 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;
- }
- }
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是爲了更好爲我們編寫代碼佈局服務,在以後的代碼範例中,都會採用下面繼承該類方式。
- 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);
- }
- };
- }
- }
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編程之代碼佈局(一)