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程序设计有所帮助。