android控件动态使用

通常android里的界面布局都是在XML里设定好的
也就是说
在程序中,不能更改界面上的元素数量等,
比如上图所示的一个 聊天会话界面
当有人发言就要增加一个TextView,
这就是动态增加控件,
这就不能在XML里事先布局了!

不过还好,ANDROID使用控件也不是只有XML这一种方式
以下代码就是动态生产控件的JAVA程序
实现效果如上图

1. package
2.   
3. import
4. import
5. import
6. import
7. import
8. import
9. import
10. import
11. import
12. import
13.   
14. import
15.   
16. /** 
17.  * 测试动态使用android控件 
18.  * @author gaolei by 20090827 
19.  */
20. public class fetion2009 extends
21. {   
22. /** Called when the activity is first created. */
23. //进度条控件,但拿出来是为了可控,动态改变其进度 
24. //聊天对话的底色是间隔的 
25. private static final int[] bg = { Color.WHITE, Color.GRAY };   
26. private static int bgIndex=0;   //聊天对话的底色 当前色应该是bg中的索引值 
27.        
28. //以下 布局参数 标识当前控件的宽高情况FILL_PARENT=占据全部父控件,WRAP_CONTENT=仅包裹控件中的内容//还有其他作用比如左右边距,这里我们使用默认的 
29. private LinearLayout.LayoutParams LP_FF = new
30. private LinearLayout.LayoutParams LP_FW = new
31. private LinearLayout.LayoutParams LP_WW = new
32.        
33. @Override
34. public void
35.     {   
36. super.onCreate( savedInstanceState );   
37.            
38. //聊天对白窗口需要滚动 
39. new ScrollView(this);   
40.         sv.setLayoutParams( LP_FF );   
41.            
42. new LinearLayout(this);   //线性布局方式 
43. //控件对其方式为垂直排列 
44. 0xff00ffff );        //设置布局板的一个特殊颜色,这可以检验我们会话时候是否有地方颜色不正确! 
45.   
46. //丰富聊天页面,也顺带测试页面滚动效果,增加了10个重复的对话内容 
47. for( int i=0; i<10; i++ )   
48.         {   
49. this, getCurrColor(), i+"聊天内容在这里。。"
50.         }   
51.            
52. //发送文件效果1,圆环进度条,也是ProgressBar默认的效果 
53. this, getCurrColor(),"我的照片.jpg");   
54.            
55. //发送文件效果2,矩行进度条,也是ProgressBar的风格设置成style="?android:attr/progressBarStyleHorizontal"的效果 
56. this, getCurrColor(),"我的照片.jpg");   
57.            
58. for( int i=0; i<10; i++ )   
59.         {   
60. this, getCurrColor(), i+"聊天内容在这里。。"
61.         }   
62. //把线性布局加入到ScrollView中 
63. //设置当前的页面为ScrollView 
64.     }   
65.        
66. /** 
67.      * 获取当前聊天对白的底色值 
68.      * @return 当前聊天对白的底色值 
69.      */
70. private int
71.     {   
72. return
73.     }   
74.        
75. /** 
76.      * 动态增加一个聊天内容 
77.      * 这里为了简化编程把 某人说 和 内容放到一个TextView中,可以根据设计文档拆成2个TextView分别显示,设置字体等 
78.      * @param layout    TextView控件欲添加到的目标layout 
79.      * @param context   构建View控件的必须参数 既View控件的环境 
80.      * @param bgColur   TextView控件的背景色 
81.      * @param MSG       TextView控件要现实的文本内容 
82.      */
83. private void setSendMsg(LinearLayout layout, Context context, int
84.     {   
85. new TextView(context);    //普通聊天对话 
86. //获取一个全局的日历实例,用于获取当前系统时间并格式化成小时:分钟形式,仅用于测试,这里的时间应该是由其他程序提供 
87. "某人  说: ["+DateFormat.format( "kk:mm" , Calendar.getInstance())+"]/n"+MSG );   
88.         tv.setBackgroundColor( bgColur );   
89.         layout.addView( tv );   
90.     }   
91.        
92. /** 
93.      * 动态增加一个发送文件的会话条目 
94.      * 这里因为是发送进度条与取消按钮的水平对其方式,所以需要增加一个LinearLayout 
95.      * @param layout    欲添加到的目标layout 
96.      * @param context   构建View控件的必须参数 既View控件的环境 
97.      * @param bgColur   控件的背景色 
98.      * @param MSG       控件要现实的文本内容 
99.      */
100. private void setSendFile(LinearLayout layout, Context context, int
101.     {   
102. //把 某人说 [时间] 
103. //要发送的文件信息 全都交给 setSendMsg 绘制吧! 
104. "正在发送"+fileName );   
105. //水平排列2个控件需要一个LinearLayout,排列方式默认的就是水平排列 
106. new
107. //这个LinearLayout控件的背景色需要设置,要不就会显示出主LinearLayout的颜色了,即0xff00ffff 
108.         myLayout.setBackgroundColor( bgColur );   
109.   
110. //动态创建一个ProgressBar,以默认属性加入到myLayout中 
111. new
112.         pb.setLayoutParams( LP_WW );   
113.         myLayout.addView( pb );   
114.   
115. //动态创建一个Button,以默认属性加入到myLayout中 
116. new
117.         bt.setLayoutParams( LP_WW );   
118. "取消"
119.         myLayout.addView( bt );   
120. //将水平布局的LinearLayout及其内如所有控件添加到主layout中 
121.         layout.addView( myLayout );   
122.     }   
123.        
124. /** 
125.      * 动态增加一个发送文件的会话条目 
126.      * 但为了保障ProgressBar和Button的底色符合设计要求,增加了一个LinearLayout,并设置其背景色 
127.      * @param layout    欲添加到的目标layout 
128.      * @param context   构建View控件的必须参数 既View控件的环境 
129.      * @param bgColur   控件的背景色 
130.      * @param MSG       控件要现实的文本内容 
131.      */
132. private void setSendFile2(LinearLayout layout, Context context, int
133.     {   
134. "正在发送"+fileName );   
135.   
136. new
137.         myLayout.setBackgroundColor( bgColur );   
138. //控件对其方式为垂直,默认为水平 
139.            
140. //ProgressBar的默认风格是圆环型,这里需要设置她的风格为Horizontal(水平线) 
141. new ProgressBar(context,null,android.R.attr.progressBarStyleHorizontal);   
142.         pb.setLayoutParams( LP_FW );   
143. 45 );           //设置第1进度为45 
144. 0 );   //这里我们不需要第2进度,所以为0 
145.         myLayout.addView( pb );   
146.            
147. new
148.         bt.setLayoutParams( LP_WW );   
149. "取消"
150.         myLayout.addView( bt );   
151.            
152.         layout.addView( myLayout );   
153.     }   
154.        
155. @Override
156. public boolean onKeyDown(int
157.     {   
158. "onKeyDown:", " keyCode=" + keyCode + " KeyEvent="
159. switch
160.         {   
161. case
162.   
163. break;   
164. case
165.   
166. break;   
167. case
168. //右左按键可以控制第一进度的增减 
169. 5
170. break;   
171. case
172. 5
173. break;   
174. case
175.   
176. break;   
177. case
178. break;   
179.         }   
180. return super.onKeyDown(keyCode, event);   
181.     }   
182. }