一、动态添加控件、设置参数
这个难度比较大,放在前面讲,用的也比较多,普通情况下,我们会提前把布局XML写好,然后对XML中的元素进行设置,但这种方法在有些情况下就显得不适合,比较聊天应用,比如帖子的回复情况。针对这些情况,我们要动态根据获取到的数据增加控件或控件组的数量,废话不多说,下面就开整吧,先看个效果图:
原始XML 动态添加控件后
所做的工作:
1、在原有的界面的基础上添加一个LinearLayout layout;参数设置为:layout_width:wrap_content;layout_height:wrap_content;
对应代码:
- LinearLayoutlayout=newLinearLayout(this);//线性布局方式
- layout.setOrientation(LinearLayout.HORIZONTAL);//
- layout.setBackgroundColor(0xff00ffff);
- LinearLayout.LayoutParamsLP_MM=newLinearLayout.LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT);
- layout.setLayoutParams(LP_MM);
2、添加一个ImageView;参数设置成layout_width:50;layout_height:50;
- ImageViewimageView=newImageView(this);
- imageView.setBackgroundResource(R.drawable.maomao);
- LinearLayout.LayoutParamsPARA=newLinearLayout.LayoutParams(50,50);
- imageView.setLayoutParams(PARA);
- layout.addView(imageView);
3、添加一个TextView;参数设置成layout_width:wrap_content;layout_height:wrap_content;
对应代码:
- TextViewtv=newTextView(this);//普通聊天对话
- tv.setText("我和猫猫是新添加的");
- tv.setBackgroundColor(Color.GRAY);
- LinearLayout.LayoutParamsLP_WW=newLinearLayout.LayoutParams(
- LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
- tv.setLayoutParams(LP_WW);
- layout.addView(tv);
4、获取当前布局,即当前main_activity的LinearLayout布局(这里有两种方法)
方法一:(这种方法不需要:setContentView(R.layout.activity_main);)
方法二:
- lin.addView(layout);
- setContentView(lin);
5、添加对新增的ImageView的单击消息响应
全部代码:
- packagecom.example.try_add_combination_ctrl;
- /**
- *动态增加控件组
- *@authorharvic
- *@date2014-1-9
- */
- importandroid.os.Bundle;
- importandroid.app.Activity;
- importandroid.graphics.Color;
- importandroid.view.View;
- importandroid.view.View.OnClickListener;
- importandroid.view.ViewGroup.LayoutParams;
- importandroid.widget.ImageView;
- importandroid.widget.LinearLayout;
- importandroid.widget.TextView;
- importandroid.widget.Toast;
- publicclassMainActivityextendsActivity{
- @Override
- protectedvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- ////获取需要被添加控件的Linear布局(方法一)
- //finalLayoutInflaterinflater=LayoutInflater.from(this);
- //LinearLayoutlin=(LinearLayout)inflater.inflate(
- //R.layout.activity_main,null).findViewById(
- //R.id.mainLinearLayout);
- //获取需要被添加控件的Linear布局(方法二)
- setContentView(R.layout.activity_main);
- finalLinearLayoutlin=(LinearLayout)findViewById(R.id.mainLinearLayout);
- //添加一个LinearLayout布局,设置成layout_width:wrap_content;layout_height:wrap_content;
- LinearLayoutlayout=newLinearLayout(this);//线性布局方式
- layout.setOrientation(LinearLayout.HORIZONTAL);//
- layout.setBackgroundColor(0xff00ffff);
- LinearLayout.LayoutParamsLP_MM=newLinearLayout.LayoutParams(
- LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT);
- layout.setLayoutParams(LP_MM);
- //添加一个ImageView,设置成layout_width:50;layout_height:50;
- ImageViewimageView=newImageView(this);
- imageView.setBackgroundResource(R.drawable.maomao);
- LinearLayout.LayoutParamsPARA=newLinearLayout.LayoutParams(50,50);//
- imageView.setLayoutParams(PARA);
- layout.addView(imageView);
- //添加一个TextView,设置成layout_width:wrap_content;layout_height:wrap_content;
- TextViewtv=newTextView(this);//普通聊天对话
- tv.setText("我和猫猫是新添加的");
- tv.setBackgroundColor(Color.GRAY);
- LinearLayout.LayoutParamsLP_WW=newLinearLayout.LayoutParams(
- LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
- tv.setLayoutParams(LP_WW);
- layout.addView(tv);
- //将动态增加的布局添加到当前布局中;
- lin.addView(layout);
- setContentView(lin);
- //向动态添加的imageView,添加点击响应
- imageView.setOnClickListener(newOnClickListener(){
- @Override
- publicvoidonClick(Viewv){
- //TODOAuto-generatedmethodstub
- Toast.makeText(MainActivity.this,Toast.LENGTH_SHORT)
- .show();
- }
- });
- }
- }
二、将某一XML动态加入到当前Activity显示
这里就跟上面的不一样了,上面的是动态生成的控件或控件组,但这里并不是动态生成的,只是将一个写好的XML在运行时加入到当前Activity的XML中显示;
先看XML布局吧
1、原来的XML(activity_main.xml)
- <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:id="@+id/mainLinearLayout"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical"
- tools:context=".MainActivity">
- <TextView
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:background="#00ff00"
- android:text="我是原生的,下面的布局是添加的"
- android:textSize="16sp"/>
- </LinearLayout>
2、要增加进去的XML(combination_ctrl.xml)
- <?xmlversion="1.0"encoding="utf-8"?>
- <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/combineCtrl"
- android:layout_width="fill_parent"
- android:layout_height="match_parent"
- android:orientation="horizontal">
- <ImageViewandroid:id="@+id/img"
- android:layout_width="100dip"
- android:layout_height="100dip"
- android:layout_margin="10.0dip"
- android:padding="2.0dip"
- android:scaleType="fitXY"/>
- <LinearLayoutandroid:orientation="vertical"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content">
- <TextViewandroid:id="@+id/name"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textColor="#FFFFFF00"
- android:textSize="22px"/>
- <TextViewandroid:id="@+id/info"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textColor="#FF00FFFF"
- android:textSize="13px"/>
- </LinearLayout>
- </LinearLayout>
看看效果:
原形状态 增加进去后
全部代码
- packagecom.example.try_add_layout_from_xml;
- /**
- *将一个现有的XML代码加入到当前的XML中,但由于ID是一定的,所以与在代码中添加include效果一样
- *@authorharvic
- *@date2014-1-9
- */
- importandroid.os.Bundle;
- importandroid.app.Activity;
- importandroid.view.LayoutInflater;
- importandroid.view.Menu;
- importandroid.widget.ImageView;
- importandroid.widget.LinearLayout;
- importandroid.widget.TextView;
- publicclassMainActivityextendsActivity{
- @Override
- protectedvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- finalLayoutInflaterinflater=LayoutInflater.from(this);
- //获取需要被添加控件的布局
- finalLinearLayoutlin=(LinearLayout)findViewById(R.id.mainLinearLayout);
- //获取需要添加的布局
- LinearLayoutlayout=(LinearLayout)inflater.inflate(
- R.layout.combination_ctrl,null).findViewById(R.id.combineCtrl);
- //将布局加入到当前布局中
- lin.addView(layout);
- ImageViewimageView=(ImageView)findViewById(R.id.img);
- imageView.setBackgroundResource(R.drawable.maomao);
- TextViewTV_info=(TextView)findViewById(R.id.info);
- TV_info.setText("第一个INOF");
- TextViewTV_name=(TextView)findViewById(R.id.name);
- TV_name.setText("第一个NAME");
- }
- }
- setContentView(R.layout.activity_main);
- finalLayoutInflaterinflater=LayoutInflater.from(this);
- //获取需要被添加控件的布局
- finalLinearLayoutlin=(LinearLayout)findViewById(R.id.mainLinearLayout);
- //获取需要添加的布局
- LinearLayoutlayout=(LinearLayout)inflater.inflate(
- R.layout.combination_ctrl,null).findViewById(R.id.combineCtrl);
- //将布局加入到当前布局中
- lin.addView(layout);
三、相关代码设置参数汇总
1、设置margin
- LinearLayout.LayoutParamslp=newLinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT);
- lp.setMargins(10,20,30,40);
- imageView.setLayoutParams(lp);
2、设置layout_weight:
- setLayoutParams(newLinearLayout.LayoutParams(
- LinearLayout.LayoutParams.FILL_PARENT,
- LinearLayout.LayoutParams.FILL_PARENT,weight
- ));
例如:
- TextViewtv_like=newTextView(this);
- LinearLayout.LayoutParamsLP_LIKE_MW=newLinearLayout.LayoutParams(
- LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT,1.0f);
- tv_like.setGravity(Gravity.CENTER);
- tv_like.setPadding(0,8,0,8);
- tv_like.setText("赞(8)");
- tv_like.setTextSize(16);
- layout_sub_Lin.addView(tv_like,LP_LIKE_MW);
上源码(两个例子代码混合在一起):http://download.csdn.net/detail/harvic880925/6829633(不要分,仅供分享)
请大家尊重原创者版权,转载请标明出处:http://www.jb51.cc/article/p-ftqkgfos-bae.html 谢谢!!!