前言
我們以前的幾個例子中都是直接使用設計器來制作的表單視圖苹丸,實際在開發(fā)中經(jīng)常會遇到使用代碼來動態(tài)的添加控件到視圖中愤惰。
一般步驟是:
1.生成一個控件,比如new Button赘理。
2.設置控件的各種屬性宦言,比如 設置某個Button的顯示文字,綁定事件等商模。
3.將這個控件追加到一個容器控件中奠旺,作為這個容器控件的子控件。比如:view.AddView(...).
4.在追加的父控件內時施流,可以指定布局的方式响疚。
在動態(tài)添加完畢后,我們還需要能夠獲得對這些動態(tài)添加后的控件的值瞪醋。比如我添加一個文本框忿晕,我還想獲得用戶在這個文本框里填入的值。android的view控件里银受,都有個屬性Tag践盼,我們可以很方便的使用這個屬性來存放我們的特殊標記鸦采,用這個特殊標記來標記我們的控件。
獲取控件的步驟:
1.獲得容器控件
2.遍歷容器控件的包含的所有子控件咕幻,根據(jù)我們設置的標識Tag屬性渔伯,或者判斷控件的類型來找到我們想要的控件
3.從找到的控件里讀取到我們想要的值。
4.將收集到的值存儲或其他處理
下面是生成表單的操作
for(int i = 0; i< 5 ; i++)
{
TableRow row = new TableRow(this);
TextView txtView1 = new TextView(this);
EditText edit1 = new EditText(this);
txtView1.setText("lable"+i+":");
txtView1.setTag("lable"+i);
txtView1.setPadding(3, 3, 3, 3);
edit1.setTag("text"+i);
edit1.setPadding(3, 3, 3, 3);
//LayoutParams layoutParams = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT);
row.addView(txtView1);
row.addView(edit1);
LayoutParams layoutParams2 = new LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT);
_pnlContent.addView(row,layoutParams2);
}
_pnlContent.setColumnStretchable(1,true);
上面的代碼演示了創(chuàng)建多個TableRow控件的過程谅河,TableRow是TableLayout的子控件咱旱。我們會在界面上放置一個TableLayout控件,然后在動態(tài)創(chuàng)建TableRow绷耍,TableLayout是個表格布局吐限,TableRow表格里的行。也就是說褂始,我們放置了一個靜態(tài)的表格诸典,然后動態(tài)的創(chuàng)建這個表格里的行。
LayoutParams 是布局參數(shù)的意思崎苗。在將創(chuàng)建好的子控件添加到它的父容器控件時狐粱,可以同時指定一個布局參數(shù)。這個布局參數(shù)指示了這個子控件如何在父容器控件里呈現(xiàn)胆数。
LayoutParams 的其中一個構造方法接受兩個參數(shù)肌蜻,指示了寬和高的布局,我們可以指定
ViewGroup.LayoutParams.WRAP_CONTENT必尼,以自身內容大小自動適應
ViewGroup.LayoutParams.FILL_PARENT蒋搜, 填充父容器
setColumnStretchable是TableRow的方法,它指示了第2列(列索引為1)是可以拉伸的判莉。
從視圖中讀取控件的內容:
我們在一個按鈕的單擊事件里寫下這樣的代碼
StringBuffer sb = new StringBuffer();
for(int i = 0 ; i< _pnlContent.getChildCount();i++)
{
TableRow tr = (TableRow)_pnlContent.getChildAt(i);
TextView txt1 = (TextView)tr.getChildAt(0);
EditText et1 = (EditText)tr.getChildAt(1);
sb.append(String.format("{%s}={%s}\n", txt1.getTag().toString(),
et1.getText() ));
}
Toast.makeText(getApplicationContext(), sb.toString(), 0).show();
如上面的代碼顯示豆挽。我們遍歷容器控件,使用方法getChildAt(0);獲得指定索引的子控件券盅,合理轉型后為我們所用帮哈。我們還可以使用Tag存放我們的額外信息。
單元格的合并
在開發(fā)過程中還會遇到使用代碼的方式來設置單元格的合并锰镀,方法如下:
LayoutParams layoutParams2 = null;
layoutParams2 = new LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT);
// 判斷 typeDesc的類型生成控件
TableRow row = null;
Button btnRemove = null;
row = new TableRow(getContext());
EditText editText = null;
editText = new EditText(getContext());
TableRow.LayoutParams rowSpanLayout = new TableRow.LayoutParams(
TableRow.LayoutParams.FILL_PARENT,
TableRow.LayoutParams.WRAP_CONTENT);
rowSpanLayout.span = 2;
editText.setLayoutParams(rowSpanLayout);
btnRemove = new Button(getContext());
btnRemove.setText("-");
row.addView(editText);
row.addView(btnRemove);
tablleLayout.addView(row,layoutParams2);
全文完娘侍,代碼下載