开发者社区> 科技小能手> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

android控件动态使用

简介:
+关注继续查看

 


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

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

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

代码仅为预研使用



本文转自 kome2000 51CTO博客,原文链接:http://blog.51cto.com/kome2000/578692

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
【Android 应用开发】Android开发技巧--Application, ListView排列,格式化浮点数,string.xml占位符,动态引用图片
【Android 应用开发】Android开发技巧--Application, ListView排列,格式化浮点数,string.xml占位符,动态引用图片
161 0
Android开发重要参考资料
=======================博客============================= 秋百万 有心课堂 郭霖 源码 安装ffmpeg 胡凯 官方培训课程 litesuitsway 爱哥 trinea robinRobin Hu...
853 0
文章
问答
文章排行榜
最热
最新
相关电子书
更多
Android内存泄漏自动化链路分析组件Probe
立即下载
Android组件化实现
立即下载
Android应用启动速度和内存优化实践
立即下载