• android 动态添加控件


    核心提示:android控件动态使用 通常android里的界面布局都是在XML里设定好的 也就是说 在程序中,不能更改界面上的元素数量等, 比如上图所示的一个
    android控件动截图:
     android控件动态使用
     

    态使用
     
    通常android里的界面布局都是在XML里设定好的
    也就是说
    在程序中,不能更改界面上的元素数量等,
    比如上图所示的一个 聊天会话界面
    当有人发言就要增加一个TextView,
    这就是动态增加控件,
    这就不能在XML里事先布局了!
    不过还好,ANDROID使用控件也不是只有XML这一种方式
    以下代码就是动态生产控件的JAVA程序
    实现效果如上图

    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. }  (原文地址:http://www.javaeye.com/topic/717932)

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/Luckeryin/archive/2010/07/23/5757517.aspx

  • 相关阅读:
    Nginx的访问控制
    远程登录
    Linux的网络命令
    laravel-collect
    laravel-model
    laravel-Macroable
    laravel-容器
    机器学习-Logisitic回归
    机器学习-多变量线性回归
    算法笔记-分支界限法
  • 原文地址:https://www.cnblogs.com/cnsanshao/p/2148710.html
Copyright © 2020-2023  润新知