Android 动态增加控件
16lz
2021-01-23
核心提示:android控件动态使用 通常android里的界面布局都是在XML里设定好的 也就是说 在程序中,不能更改界面上的元素数量等, 比如上图所示的一个
android控件动态使用
通常android里的界面布局都是在XML里设定好的
也就是说
在程序中,不能更改界面上的元素数量等,
比如上图所示的一个 聊天会话界面
当有人发言就要增加一个TextView,
这就是动态增加控件,
这就不能在XML里事先布局了!
不过还好,ANDROID使用控件也不是只有XML这一种方式
以下代码就是动态生产控件的JAVA程序
实现效果如上图
android控件动态使用
通常android里的界面布局都是在XML里设定好的
也就是说
在程序中,不能更改界面上的元素数量等,
比如上图所示的一个 聊天会话界面
当有人发言就要增加一个TextView,
这就是动态增加控件,
这就不能在XML里事先布局了!
不过还好,ANDROID使用控件也不是只有XML这一种方式
以下代码就是动态生产控件的JAVA程序
实现效果如上图
1. package com.fetion.android; 2. 3. import android.app.Activity; 4. import android.content.Context; 5. import android.graphics.Color; 6. import android.os.Bundle; 7. import android.text.Layout; 8. import android.text.format.DateFormat; 9. import android.util.Log; 10. import android.view.KeyEvent; 11. import android.view.ViewGroup.LayoutParams; 12. import android.widget.*; 13. 14. import java.util.Calendar; 15. 16. /** 17. * 测试动态使用android控件 18. * @author gaolei by 20090827 19. */ 20. public class fetion2009 extends Activity 21. { 22. /** Called when the activity is first created. */ 23. ProgressBar pb; //进度条控件,但拿出来是为了可控,动态改变其进度 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 LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT); 30. private LinearLayout.LayoutParams LP_FW = new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT); 31. private LinearLayout.LayoutParams LP_WW = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 32. 33. @Override 34. public void onCreate( Bundle savedInstanceState ) 35. { 36. super.onCreate( savedInstanceState ); 37. 38. //聊天对白窗口需要滚动 39. ScrollView sv = new ScrollView(this); 40. sv.setLayoutParams( LP_FF ); 41. 42. LinearLayout layout = new LinearLayout(this); //线性布局方式 43. layout.setOrientation( LinearLayout.VERTICAL ); //控件对其方式为垂直排列 44. layout.setBackgroundColor( 0xff00ffff ); //设置布局板的一个特殊颜色,这可以检验我们会话时候是否有地方颜色不正确! 45. 46. //丰富聊天页面,也顺带测试页面滚动效果,增加了10个重复的对话内容 47. for( int i=0; i<10; i++ ) 48. { 49. setSendMsg( layout, this, getCurrColor(), i+"聊天内容在这里。。" ); 50. } 51. 52. //发送文件效果1,圆环进度条,也是ProgressBar默认的效果 53. setSendFile( layout, this, getCurrColor(),"我的照片.jpg"); 54. 55. //发送文件效果 2,矩行进度条,也是ProgressBar的风格设置成 style="?android:attr/progressBarStyleHorizontal"的效果 56. setSendFile2( layout, this, getCurrColor(),"我的照片.jpg"); 57. 58. for( int i=0; i<10; i++ ) 59. { 60. setSendMsg( layout, this, getCurrColor(), i+"聊天内容在这里。。" ); 61. } 62. sv.addView( layout ); //把线性布局加入到ScrollView中 63. setContentView(sv); //设置当前的页面为ScrollView 64. } 65. 66. /** 67. * 获取当前聊天对白的底色值 68. * @return 当前聊天对白的底色值 69. */ 70. private int getCurrColor() 71. { 72. return bg[ (++bgIndex)% bg.length ]; 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 bgColur, String MSG) 84. { 85. TextView tv = new TextView(context); //普通聊天对话 86. //获取一个全局的日历实例,用于获取当前系统时间并格式化成小时:分钟形式,仅用于测试,这里的时间应该是由其他程序提供 87. tv.setText( "某人 说: ["+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 bgColur, String fileName) 101. { 102. //把 某人说 [时间] 103. //要发送的文件信息 全都交给 setSendMsg 绘制吧! 104. setSendMsg( layout, context, bgColur, "正在发送"+fileName ); 105. //水平排列2个控件需要一个LinearLayout,排列方式默认的就是水平排列 106. LinearLayout myLayout = new LinearLayout(context); 107. //这个 LinearLayout控件的背景色需要设置,要不就会显示出主LinearLayout的颜色了,即0xff00ffff 108. myLayout.setBackgroundColor( bgColur ); 109. 110. //动态创建一个 ProgressBar,以默认属性加入到myLayout中 111. ProgressBar pb = new ProgressBar(context); 112. pb.setLayoutParams( LP_WW ); 113. myLayout.addView( pb ); 114. 115. //动态创建一个 Button,以默认属性加入到myLayout中 116. Button bt = new Button(context); 117. bt.setLayoutParams( LP_WW ); 118. bt.setText( " 取消" ); 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 bgColur, String fileName) 133. { 134. setSendMsg( layout, context, bgColur, "正在发送"+fileName ); 135. 136. LinearLayout myLayout = new LinearLayout(context); 137. myLayout.setBackgroundColor( bgColur ); 138. myLayout.setOrientation( LinearLayout.VERTICAL );//控件对其方式为垂直,默认为水平 139. 140. //ProgressBar 的默认风格是圆环型,这里需要设置她的风格为Horizontal(水平线) 141. pb = new ProgressBar(context,null,android.R.attr.progressBarStyleHorizontal); 142. pb.setLayoutParams( LP_FW ); 143. pb.setProgress( 45 ); // 设置第1进度为45 144. pb.setSecondaryProgress( 0 ); //这里我们不需要第2进度,所以为0 145. myLayout.addView( pb ); 146. 147. Button bt = new Button(context); 148. bt.setLayoutParams( LP_WW ); 149. bt.setText( "取消" ); 150. myLayout.addView( bt ); 151. 152. layout.addView( myLayout ); 153. } 154. 155. @Override 156. public boolean onKeyDown(int keyCode, KeyEvent event) 157. { 158. Log.d("onKeyDown:", " keyCode=" + keyCode + " KeyEvent=" + event); 159. switch (keyCode) 160. { 161. case KeyEvent.KEYCODE_DPAD_UP: 162. 163. break; 164. case KeyEvent.KEYCODE_DPAD_DOWN: 165. 166. break; 167. case KeyEvent.KEYCODE_DPAD_LEFT: 168. //右左按键可以控制第一进度的增减 169. pb.setProgress( pb.getProgress()-5 ); 170. break; 171. case KeyEvent.KEYCODE_DPAD_RIGHT: 172. pb.setProgress( pb.getProgress()+5 ); 173. break; 174. case KeyEvent.KEYCODE_DPAD_CENTER: 175. 176. break; 177. case KeyEvent.KEYCODE_0: 178. break; 179. } 180. return super.onKeyDown(keyCode, event); 181. } 182. }
更多相关文章
- android UI进阶之布局的优化(二)
- Android 主题动态切换框架:Prism
- [Android] 拍照、截图、保存并显示在ImageView控件中
- [置顶] Android 界面滑动实现---Scroller类 从源码和开发文档中
- Android拼图滑块验证码控件
- Android中的通知和自定义通知布局