Android控件动态用法实例分析
本文实例讲述了Android控件动态用法。分享给大家供大家参考。具体如下:
通常android里的界面布局都是在XML里设定好的
也就是说在程序中,不能更改界面上的元素数量等,
比如聊天会话界面
当有人发言就要增加一个TextView,这就是动态增加控件,这就不能在XML里事先布局了!
不过还好,ANDROID使用控件也不是只有XML这一种方式
以下代码就是动态生产控件的JAVA程序
packagecom.fetion.android; importandroid.app.Activity; importandroid.content.Context; importandroid.graphics.Color; importandroid.os.Bundle; importandroid.text.Layout; importandroid.text.format.DateFormat; importandroid.util.Log; importandroid.view.KeyEvent; importandroid.view.ViewGroup.LayoutParams; importandroid.widget.*; importjava.util.Calendar; /** *测试动态使用android控件 *@authorgaoleiby20090827 */ publicclassfetion2009extendsActivity { /**Calledwhentheactivityisfirstcreated.*/ ProgressBarpb;//进度条控件,但拿出来是为了可控,动态改变其进度 //聊天对话的底色是间隔的 privatestaticfinalint[]bg={Color.WHITE,Color.GRAY}; privatestaticintbgIndex=0;//聊天对话的底色当前色应该是bg中的索引值 //以下布局参数标识当前控件的宽高情况FILL_PARENT=占据全部父控件,WRAP_CONTENT=仅包裹控件中的内容//还有其他作用比如左右边距,这里我们使用默认的 privateLinearLayout.LayoutParamsLP_FF=newLinearLayout.LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT); privateLinearLayout.LayoutParamsLP_FW=newLinearLayout.LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT); privateLinearLayout.LayoutParamsLP_WW=newLinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT); @Override publicvoidonCreate(BundlesavedInstanceState) { super.onCreate(savedInstanceState); //聊天对白窗口需要滚动 ScrollViewsv=newScrollView(this); sv.setLayoutParams(LP_FF); LinearLayoutlayout=newLinearLayout(this);//线性布局方式 layout.setOrientation(LinearLayout.VERTICAL);//控件对其方式为垂直排列 layout.setBackgroundColor(0xff00ffff);//设置布局板的一个特殊颜色,这可以检验我们会话时候是否有地方颜色不正确! //丰富聊天页面,也顺带测试页面滚动效果,增加了10个重复的对话内容 for(inti=0;i<10;i++) { setSendMsg(layout,this,getCurrColor(),i+"聊天内容在这里。。"); } //发送文件效果1,圆环进度条,也是ProgressBar默认的效果 setSendFile(layout,this,getCurrColor(),"我的照片.jpg"); //发送文件效果2,矩行进度条,也是ProgressBar的风格设置成style="?android:attr/progressBarStyleHorizontal"的效果 setSendFile2(layout,this,getCurrColor(),"我的照片.jpg"); for(inti=0;i<10;i++) { setSendMsg(layout,this,getCurrColor(),i+"聊天内容在这里。。"); } sv.addView(layout);//把线性布局加入到ScrollView中 setContentView(sv);//设置当前的页面为ScrollView } /** *获取当前聊天对白的底色值 *@return当前聊天对白的底色值 */ privateintgetCurrColor() { returnbg[(++bgIndex)%bg.length]; } /** *动态增加一个聊天内容 *这里为了简化编程把某人说和内容放到一个TextView中,可以根据设计文档拆成2个TextView分别显示,设置字体等 *@paramlayoutTextView控件欲添加到的目标layout *@paramcontext构建View控件的必须参数既View控件的环境 *@parambgColurTextView控件的背景色 *@paramMSGTextView控件要现实的文本内容 */ privatevoidsetSendMsg(LinearLayoutlayout,Contextcontext,intbgColur,StringMSG) { TextViewtv=newTextView(context);//普通聊天对话 //获取一个全局的日历实例,用于获取当前系统时间并格式化成小时:分钟形式,仅用于测试,这里的时间应该是由其他程序提供 tv.setText("某人说:["+DateFormat.format("kk:mm",Calendar.getInstance())+"]\n"+MSG); tv.setBackgroundColor(bgColur); layout.addView(tv); } /** *动态增加一个发送文件的会话条目 *这里因为是发送进度条与取消按钮的水平对其方式,所以需要增加一个LinearLayout *@paramlayout欲添加到的目标layout *@paramcontext构建View控件的必须参数既View控件的环境 *@parambgColur控件的背景色 *@paramMSG控件要现实的文本内容 */ privatevoidsetSendFile(LinearLayoutlayout,Contextcontext,intbgColur,StringfileName) { //把某人说[时间] //要发送的文件信息全都交给setSendMsg绘制吧! setSendMsg(layout,context,bgColur,"正在发送"+fileName); //水平排列2个控件需要一个LinearLayout,排列方式默认的就是水平排列 LinearLayoutmyLayout=newLinearLayout(context); //这个LinearLayout控件的背景色需要设置,要不就会显示出主LinearLayout的颜色了,即0xff00ffff myLayout.setBackgroundColor(bgColur); //动态创建一个ProgressBar,以默认属性加入到myLayout中 ProgressBarpb=newProgressBar(context); pb.setLayoutParams(LP_WW); myLayout.addView(pb); //动态创建一个Button,以默认属性加入到myLayout中 Buttonbt=newButton(context); bt.setLayoutParams(LP_WW); bt.setText("取消"); myLayout.addView(bt); //将水平布局的LinearLayout及其内如所有控件添加到主layout中 layout.addView(myLayout); } /** *动态增加一个发送文件的会话条目 *但为了保障ProgressBar和Button的底色符合设计要求,增加了一个LinearLayout,并设置其背景色 *@paramlayout欲添加到的目标layout *@paramcontext构建View控件的必须参数既View控件的环境 *@parambgColur控件的背景色 *@paramMSG控件要现实的文本内容 */ privatevoidsetSendFile2(LinearLayoutlayout,Contextcontext,intbgColur,StringfileName) { setSendMsg(layout,context,bgColur,"正在发送"+fileName); LinearLayoutmyLayout=newLinearLayout(context); myLayout.setBackgroundColor(bgColur); myLayout.setOrientation(LinearLayout.VERTICAL);//控件对其方式为垂直,默认为水平 //ProgressBar的默认风格是圆环型,这里需要设置她的风格为Horizontal(水平线) pb=newProgressBar(context,null,android.R.attr.progressBarStyleHorizontal); pb.setLayoutParams(LP_FW); pb.setProgress(45);//设置第1进度为45 pb.setSecondaryProgress(0);//这里我们不需要第2进度,所以为0 myLayout.addView(pb); Buttonbt=newButton(context); bt.setLayoutParams(LP_WW); bt.setText("取消"); myLayout.addView(bt); layout.addView(myLayout); } @Override publicbooleanonKeyDown(intkeyCode,KeyEventevent) { Log.d("onKeyDown:","keyCode="+keyCode+"KeyEvent="+event); switch(keyCode) { caseKeyEvent.KEYCODE_DPAD_UP: break; caseKeyEvent.KEYCODE_DPAD_DOWN: break; caseKeyEvent.KEYCODE_DPAD_LEFT: //右左按键可以控制第一进度的增减 pb.setProgress(pb.getProgress()-5); break; caseKeyEvent.KEYCODE_DPAD_RIGHT: pb.setProgress(pb.getProgress()+5); break; caseKeyEvent.KEYCODE_DPAD_CENTER: break; caseKeyEvent.KEYCODE_0: break; } returnsuper.onKeyDown(keyCode,event); } }
希望本文所述对大家的Android程序设计有所帮助。