android開發(fā) 動(dòng)態(tài)生成控件
1 (2).jpg (493.21 KB, 下載次數(shù): 157)
下載附件
2011-06-23 14:19 上傳
我們以前的幾個(gè)例子中都是直接使用設(shè)計(jì)器來(lái)制作的表單視圖,實(shí)際在開發(fā)中經(jīng)常會(huì)遇到使用代碼來(lái)動(dòng)態(tài)的添加控件到視圖中。一般情況下的步驟是:
1.生成一個(gè)控件,比如new Button。
2.設(shè)置控件的各種屬性,比如 設(shè)置某個(gè)Button的顯示文字,綁定事件等。
3.將這個(gè)控件追加到一個(gè)容器控件中,作為這個(gè)容器控件的子控件。比如:view.AddView(...).
4.在追加的父控件內(nèi)時(shí),可以指定布局的方式。
在動(dòng)態(tài)添加完畢后,我們還需要能夠獲得對(duì)這些動(dòng)態(tài)添加后的控件的值。比如我添加一個(gè)文本框,我還想獲得用戶在這個(gè)文本框里填入的值。android的view控件里,都有個(gè)屬性Tag,我們可以很方便的使用這個(gè)屬性來(lái)存放我們的特殊標(biāo)記,用這個(gè)特殊標(biāo)記來(lái)標(biāo)記我們的控件。
獲取控件的步驟:
1.獲得容器控件
2.遍歷容器控件的包含的所有子控件,根據(jù)我們?cè)O(shè)置的標(biāo)識(shí)Tag屬性,或者判斷控件的類型來(lái)找到我們想要的控件
3.從找到的控件里讀取到我們想要的值。
4.將收集到的值存儲(chǔ)或其他處理-
- //下面是生成表單的操作
- 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);
復(fù)制代碼 上面的代碼演示了創(chuàng)建多個(gè)TableRow控件的過程,TableRow是TableLayout的子控件。我們會(huì)在界面上放置一個(gè)TableLayout控件,然后在動(dòng)態(tài)創(chuàng)建TableRow,TableLayout是個(gè)表格布局,TableRow表格里的行。也就是說,我們放置了一個(gè)靜態(tài)的表格,然后動(dòng)態(tài)的創(chuàng)建這個(gè)表格里的行。
LayoutParams 是布局參數(shù)的意思。在將創(chuàng)建好的子控件添加到它的父容器控件時(shí),可以同時(shí)指定一個(gè)布局參數(shù)。這個(gè)布局參數(shù)指示了這個(gè)子控件如何在父容器控件里呈現(xiàn)。
LayoutParams 的其中一個(gè)構(gòu)造方法接受兩個(gè)參數(shù),指示了寬和高的布局,我們可以指定
ViewGroup.LayoutParams.WRAP_CONTENT,以自身內(nèi)容大小自動(dòng)適應(yīng)
ViewGroup.LayoutParams.FILL_PARENT, 填充父容器
setColumnStretchable是TableRow的方法,他指示了第2列(列索引為1)是可以拉伸的。
從視圖中讀取控件的內(nèi)容:
我們?cè)谝粋(gè)按鈕的單擊事件里寫下這樣的代碼
- 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();
復(fù)制代碼 如上面的代碼顯示。我們遍歷容器控件,使用方法getChildAt(0);獲得指定索引的子控件,合理轉(zhuǎn)型后為我們所用。我們還可以使用Tag存放我們的額外信息。 |