LinearLayout动态添加控件及将某XML动态加入到Activity显示(1)

来源:互联网 发布:淘宝卖家发布宝贝流程 编辑:程序博客网 时间:2024/05/22 10:08

目录(?)[+]

本文第二篇:《动态添加综合布局---动态添加控件及将某XML动态加入到Activity显示(续)


汇总:layoutParams可以设定view和viewgroup在父布局中的位置和所占比例,即layoutParams.setMargin和layoutParams.gravity(前提是大小不能设定为MatchParent),

View view=new View(content)可以利用view设定相应控件的各种属性,比如background和text等,重要的是还有view.setPadding。


一、动态添加控件、设置参数

这个难度比较大,放在前面讲,用的也比较多,普通情况下,我们会提前把布局XML写好,然后对XML中的元素进行设置,但这种方法在有些情况下就显得不适合,比较聊天应用,比如帖子的回复情况。针对这些情况,我们要动态根据获取到的数据增加控件或控件组的数量,废话不多说,下面就开整吧,先看个效果图:

                                 原始XML                                                                        动态添加控件后

           

所做的工作:

1、在原有的界面的基础上添加一个LinearLayout   layout;参数设置为:layout_width:wrap_content;layout_height:wrap_content;

对应代码:

[java] view plain copy
  1. LinearLayout layout = new LinearLayout(this); // 线性布局方式  
  2. layout.setOrientation(LinearLayout.HORIZONTAL); //  
  3. layout.setBackgroundColor(0xff00ffff);  
  4. LinearLayout.LayoutParams LP_MM = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);    
  5. layout.setLayoutParams(LP_MM);  

2、添加一个ImageView;参数设置成layout_width:50;layout_height:50;

[java] view plain copy
  1. ImageView imageView= new ImageView(this);  
  2. imageView.setBackgroundResource(R.drawable.maomao);  
  3. LinearLayout.LayoutParams PARA = new LinearLayout.LayoutParams(50,50);  
  4. imageView.setLayoutParams(PARA);  
  5. layout.addView(imageView);  

3、添加一个TextView;参数设置成layout_width:wrap_content;layout_height:wrap_content;

对应代码:

[java] view plain copy
  1. TextView tv = new TextView(this); // 普通聊天对话  
  2. tv.setText("我和猫猫是新添加的");  
  3. tv.setBackgroundColor(Color.GRAY);  
  4. LinearLayout.LayoutParams LP_WW = new LinearLayout.LayoutParams(  
  5.         LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);  
  6. tv.setLayoutParams(LP_WW);  
  7. layout.addView(tv);  

4、获取当前布局,即当前main_activity的LinearLayout布局(这里有两种方法)
方法一
:(这种方法不需要:setContentView(R.layout.activity_main);)

[java] view plain copy
  1.  // 获取需要被添加控件的Linear布局(方法一)  
  2. final LayoutInflater inflater = LayoutInflater.from(this);  
  3. LinearLayout lin = (LinearLayout) inflater.inflate(  
  4.         R.layout.activity_main, null).findViewById(  
  5.         R.id.mainLinearLayout);  

方法二:

[java] view plain copy
  1. // 获取需要被添加控件的Linear布局(方法二)  
  2. setContentView(R.layout.activity_main);  
  3. final LinearLayout lin = (LinearLayout) findViewById(R.id.mainLinearLayout);  

5、将动态增加的布局添加到当前布局中并显示;

[java] view plain copy
  1. lin.addView(layout);  
  2. setContentView(lin);  

5、添加对新增的ImageView的单击消息响应

[java] view plain copy
  1. //向动态添加的imageView,添加点击响应  
  2. imageView.setOnClickListener(new OnClickListener() {  
  3.       
  4.     @Override  
  5.     public void onClick(View v) {  
  6.         // TODO Auto-generated method stub  
  7.         Toast.makeText(MainActivity.this"点击了图片", Toast.LENGTH_SHORT).show();  
  8.     }  
  9. });  

 

全部代码:

[java] view plain copy
  1. package com.example.try_add_combination_ctrl;  
  2. /** 
  3.  * 动态增加控件组 
  4.  * @author harvic 
  5.  * @date 2014-1-9 
  6.  */  
  7. import android.os.Bundle;  
  8. import android.app.Activity;  
  9. import android.graphics.Color;  
  10. import android.view.View;  
  11. import android.view.View.OnClickListener;  
  12. import android.view.ViewGroup.LayoutParams;  
  13. import android.widget.ImageView;  
  14. import android.widget.LinearLayout;  
  15. import android.widget.TextView;  
  16. import android.widget.Toast;  
  17.   
  18. public class MainActivity extends Activity {  
  19.   
  20.     @Override  
  21.     protected void onCreate(Bundle savedInstanceState) {  
  22.         super.onCreate(savedInstanceState);  
  23.   
  24. //      // 获取需要被添加控件的Linear布局(方法一)  
  25. //      final LayoutInflater inflater = LayoutInflater.from(this);  
  26. //      LinearLayout lin = (LinearLayout) inflater.inflate(  
  27. //              R.layout.activity_main, null).findViewById(  
  28. //              R.id.mainLinearLayout);  
  29.   
  30.         // 获取需要被添加控件的Linear布局(方法二)  
  31.         setContentView(R.layout.activity_main);  
  32.         final LinearLayout lin = (LinearLayout) findViewById(R.id.mainLinearLayout);  
  33.   
  34.         // 添加一个LinearLayout布局,设置成layout_width:wrap_content;layout_height:wrap_content;  
  35.         LinearLayout layout = new LinearLayout(this); // 线性布局方式  
  36.         layout.setOrientation(LinearLayout.HORIZONTAL); //  
  37.         layout.setBackgroundColor(0xff00ffff);  
  38.         LinearLayout.LayoutParams LP_MM = new LinearLayout.LayoutParams(  
  39.                 LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);  
  40.         layout.setLayoutParams(LP_MM);  
  41.           
  42.         //添加一个ImageView,设置成layout_width:50;layout_height:50;  
  43.         ImageView imageView = new ImageView(this);  
  44.         imageView.setBackgroundResource(R.drawable.maomao);  
  45.         LinearLayout.LayoutParams PARA = new LinearLayout.LayoutParams(5050);//  
  46.         imageView.setLayoutParams(PARA);  
  47.         layout.addView(imageView);  
  48.   
  49.         //添加一个TextView,设置成layout_width:wrap_content;layout_height:wrap_content;  
  50.         TextView tv = new TextView(this); // 普通聊天对话  
  51.         tv.setText("我和猫猫是新添加的");  
  52.         tv.setBackgroundColor(Color.GRAY);  
  53.         LinearLayout.LayoutParams LP_WW = new LinearLayout.LayoutParams(  
  54.                 LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);  
  55.         tv.setLayoutParams(LP_WW);  
  56.         layout.addView(tv);  
  57.   
  58.         //将动态增加的布局添加到当前布局中;  
  59.         lin.addView(layout);  
  60.         setContentView(lin);  
  61.           
  62.         // 向动态添加的imageView,添加点击响应  
  63.         imageView.setOnClickListener(new OnClickListener() {  
  64.   
  65.             @Override  
  66.             public void onClick(View v) {  
  67.                 // TODO Auto-generated method stub  
  68.                 Toast.makeText(MainActivity.this"点击了图片", Toast.LENGTH_SHORT)  
  69.                         .show();  
  70.             }  
  71.         });  
  72.           
  73.     }  
  74.   
  75. }  

源码在文章最底部给出

二、将某一XML动态加入到当前Activity显示

这里就跟上面的不一样了,上面的是动态生成的控件或控件组,但这里并不是动态生成的,只是将一个写好的XML在运行时加入到当前Activity的XML中显示;

先看XML布局吧

1、原来的XML(activity_main.xml)

[html] view plain copy
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:id="@+id/mainLinearLayout"  
  4.     android:layout_width="match_parent"  
  5.     android:layout_height="match_parent"  
  6.     android:orientation="vertical"  
  7.     tools:context=".MainActivity" >  
  8.     <TextView   
  9.         android:layout_width="fill_parent"  
  10.         android:layout_height="wrap_content"  
  11.         android:background="#00ff00"  
  12.         android:text="我是原生的,下面的布局是添加的"  
  13.         android:textSize="16sp" />  
  14.       
  15. </LinearLayout>  

2、要增加进去的XML(combination_ctrl.xml)

[html] view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:id="@+id/combineCtrl"  
  4.     android:layout_width="fill_parent"  
  5.     android:layout_height="match_parent"  
  6.     android:orientation="horizontal" >  
  7.       
  8.     <ImageView android:id="@+id/img"   
  9.         android:layout_width="100dip"  
  10.         android:layout_height="100dip"   
  11.         android:layout_margin="10.0dip"  
  12.         android:padding="2.0dip"  
  13.         android:scaleType="fitXY"/>  
  14.   
  15.     <LinearLayout android:orientation="vertical"  
  16.         android:layout_width="wrap_content"   
  17.         android:layout_height="wrap_content">  
  18.   
  19.         <TextView android:id="@+id/name"   
  20.             android:layout_width="wrap_content"  
  21.             android:layout_height="wrap_content"   
  22.             android:textColor="#FFFFFF00"  
  23.             android:textSize="22px" />  
  24.         <TextView android:id="@+id/info"   
  25.             android:layout_width="wrap_content"  
  26.             android:layout_height="wrap_content"   
  27.             android:textColor="#FF00FFFF"  
  28.             android:textSize="13px" />  
  29.     </LinearLayout>  
  30.       
  31.   
  32. </LinearLayout>  

看看效果:

                             原形状态                                                                 增加进去后

 

 全部代码

 

[java] view plain copy
  1. package com.example.try_add_layout_from_xml;  
  2.   
  3. /** 
  4.  * 将一个现有的XML代码加入到当前的XML中,但由于ID是一定的,所以与在代码中添加include效果一样 
  5.  * @author harvic 
  6.  * @date 2014-1-9 
  7.  */  
  8. import android.os.Bundle;  
  9. import android.app.Activity;  
  10. import android.view.LayoutInflater;  
  11. import android.view.Menu;  
  12. import android.widget.ImageView;  
  13. import android.widget.LinearLayout;  
  14. import android.widget.TextView;  
  15.   
  16. public class MainActivity extends Activity {  
  17.   
  18.     @Override  
  19.     protected void onCreate(Bundle savedInstanceState) {  
  20.         super.onCreate(savedInstanceState);  
  21.   
  22.         setContentView(R.layout.activity_main);  
  23.         final LayoutInflater inflater = LayoutInflater.from(this);  
  24.         // 获取需要被添加控件的布局  
  25.         final LinearLayout lin = (LinearLayout) findViewById(R.id.mainLinearLayout);  
  26.         // 获取需要添加的布局  
  27.         LinearLayout layout = (LinearLayout) inflater.inflate(  
  28.                 R.layout.combination_ctrl, null).findViewById(R.id.combineCtrl);  
  29.         // 将布局加入到当前布局中  
  30.         lin.addView(layout);  
  31.   
  32.         ImageView imageView = (ImageView) findViewById(R.id.img);  
  33.         imageView.setBackgroundResource(R.drawable.maomao);  
  34.         TextView TV_info = (TextView) findViewById(R.id.info);  
  35.         TV_info.setText("第一个INOF");  
  36.         TextView TV_name = (TextView) findViewById(R.id.name);  
  37.         TV_name.setText("第一个NAME");  
  38.   
  39.     }  
  40. }  

可见代码非常短,而且关键代码就只有五句,专门列出来

[java] view plain copy
  1. setContentView(R.layout.activity_main);  
  2. final LayoutInflater inflater = LayoutInflater.from(this);  
  3. // 获取需要被添加控件的布局  
  4. final LinearLayout lin = (LinearLayout) findViewById(R.id.mainLinearLayout);  
  5. // 获取需要添加的布局  
  6. LinearLayout layout = (LinearLayout) inflater.inflate(  
  7.         R.layout.combination_ctrl, null).findViewById(R.id.combineCtrl);  
  8. // 将布局加入到当前布局中  
  9. lin.addView(layout);  

源码在文章最底部

三、相关代码设置参数汇总

1、设置margin

[java] view plain copy
  1. LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);  
  2. lp.setMargins(10203040);  
  3. imageView.setLayoutParams(lp);  

2、设置layout_weight(功能就是android:layout_weight="1"):

[java] view plain copy
  1. setLayoutParams(new LinearLayout.LayoutParams(  
  2.                           LinearLayout.LayoutParams.FILL_PARENT,  
  3.                           LinearLayout.LayoutParams.FILL_PARENT,weight  
  4.                       ));  

例如:

[java] view plain copy
  1. TextView tv_like = new TextView(this);  
  2. LinearLayout.LayoutParams LP_LIKE_MW = new LinearLayout.LayoutParams(  
  3.         LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT, 1.0f);  
  4. tv_like.setGravity(Gravity.CENTER);  
  5. tv_like.setPadding(0808);  
  6. tv_like.setText("赞(8)");  
  7. tv_like.setTextSize(16);      
  8. layout_sub_Lin.addView(tv_like, LP_LIKE_MW);  

3、设置layout_gravity(属性有CENTER \ LEFT \ RIGHT等)

LinearLayout.LayoutParams iv=new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);        iv.gravity=Gravity.RIGHT;        linearlayout.addView(imageView,iv);//linearlayout为viewgroup,iv为layoutparams


汇总:layoutParams可以设定view和viewgroup在父布局中的位置和所占比例,即layoutParams.setMargin和layoutParams.gravity(前提是大小不能设定为MatchParent),

View view=new View(content)可以利用view设定相应控件的各种属性,比如background和text等。



 

 


上源码(两个例子代码混合在一起):http://download.csdn.net/detail/harvic880925/6829633 (不要分,仅供分享)

 

 请大家尊重原创者版权,转载请标明出处:http://blog.csdn.net/harvic880925/article/details/18042183  谢谢!!!

阅读全文
0 0
原创粉丝点击