加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

动态添加控件及将某XML动态加入到Activity显示

发布时间:2020-12-16 05:58:45 所属栏目:百科 来源:网络整理
导读:一、动态添加控件、设置参数 这个难度比较大,放在前面讲,用的也比较多,普通情况下,我们会提前把布局XML写好,然后对XML中的元素进行设置,但这种方法在有些情况下就显得不适合,比较聊天应用,比如帖子的回复情况。针对这些情况,我们要动态根据获取到的

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

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

原始XML 动态添加控件后

所做的工作:

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

对应代码:

[java] view plain copy
  1. LinearLayoutlayout=newLinearLayout(this);//线性布局方式
  2. layout.setOrientation(LinearLayout.HORIZONTAL);//
  3. layout.setBackgroundColor(0xff00ffff);
  4. LinearLayout.LayoutParamsLP_MM=newLinearLayout.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. ImageViewimageView=newImageView(this);
  2. imageView.setBackgroundResource(R.drawable.maomao);
  3. LinearLayout.LayoutParamsPARA=newLinearLayout.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. TextViewtv=newTextView(this);//普通聊天对话
  2. tv.setText("我和猫猫是新添加的");
  3. tv.setBackgroundColor(Color.GRAY);
  4. LinearLayout.LayoutParamsLP_WW=newLinearLayout.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. finalLayoutInflaterinflater=LayoutInflater.from(this);
  3. LinearLayoutlin=(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. finalLinearLayoutlin=(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(newOnClickListener(){
  3. @Override
  4. publicvoidonClick(Viewv){
  5. //TODOAuto-generatedmethodstub
  6. Toast.makeText(MainActivity.this,"点击了图片",Toast.LENGTH_SHORT).show();
  7. }
  8. });

全部代码:

[java] view plain copy
  1. packagecom.example.try_add_combination_ctrl;
  2. /**
  3. *动态增加控件组
  4. *@authorharvic
  5. *@date2014-1-9
  6. */
  7. importandroid.os.Bundle;
  8. importandroid.app.Activity;
  9. importandroid.graphics.Color;
  10. importandroid.view.View;
  11. importandroid.view.View.OnClickListener;
  12. importandroid.view.ViewGroup.LayoutParams;
  13. importandroid.widget.ImageView;
  14. importandroid.widget.LinearLayout;
  15. importandroid.widget.TextView;
  16. importandroid.widget.Toast;
  17. publicclassMainActivityextendsActivity{
  18. @Override
  19. protectedvoidonCreate(BundlesavedInstanceState){
  20. super.onCreate(savedInstanceState);
  21. ////获取需要被添加控件的Linear布局(方法一)
  22. //finalLayoutInflaterinflater=LayoutInflater.from(this);
  23. //LinearLayoutlin=(LinearLayout)inflater.inflate(
  24. //R.layout.activity_main,null).findViewById(
  25. //R.id.mainLinearLayout);
  26. //获取需要被添加控件的Linear布局(方法二)
  27. setContentView(R.layout.activity_main);
  28. finalLinearLayoutlin=(LinearLayout)findViewById(R.id.mainLinearLayout);
  29. //添加一个LinearLayout布局,设置成layout_width:wrap_content;layout_height:wrap_content;
  30. LinearLayoutlayout=newLinearLayout(this);//线性布局方式
  31. layout.setOrientation(LinearLayout.HORIZONTAL);//
  32. layout.setBackgroundColor(0xff00ffff);
  33. LinearLayout.LayoutParamsLP_MM=newLinearLayout.LayoutParams(
  34. LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT);
  35. layout.setLayoutParams(LP_MM);
  36. //添加一个ImageView,设置成layout_width:50;layout_height:50;
  37. ImageViewimageView=newImageView(this);
  38. imageView.setBackgroundResource(R.drawable.maomao);
  39. LinearLayout.LayoutParamsPARA=newLinearLayout.LayoutParams(50,50);//
  40. imageView.setLayoutParams(PARA);
  41. layout.addView(imageView);
  42. //添加一个TextView,设置成layout_width:wrap_content;layout_height:wrap_content;
  43. TextViewtv=newTextView(this);//普通聊天对话
  44. tv.setText("我和猫猫是新添加的");
  45. tv.setBackgroundColor(Color.GRAY);
  46. LinearLayout.LayoutParamsLP_WW=newLinearLayout.LayoutParams(
  47. LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
  48. tv.setLayoutParams(LP_WW);
  49. layout.addView(tv);
  50. //将动态增加的布局添加到当前布局中;
  51. lin.addView(layout);
  52. setContentView(lin);
  53. //向动态添加的imageView,添加点击响应
  54. imageView.setOnClickListener(newOnClickListener(){
  55. @Override
  56. publicvoidonClick(Viewv){
  57. //TODOAuto-generatedmethodstub
  58. Toast.makeText(MainActivity.this,Toast.LENGTH_SHORT)
  59. .show();
  60. }
  61. });
  62. }
  63. }

源码在文章最底部给出

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

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

先看XML布局吧

1、原来的XML(activity_main.xml)

[html] view plain copy
  1. <LinearLayoutxmlns: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. </LinearLayout>

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

[html] view plain copy
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns: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. <ImageViewandroid:id="@+id/img"
  8. android:layout_width="100dip"
  9. android:layout_height="100dip"
  10. android:layout_margin="10.0dip"
  11. android:padding="2.0dip"
  12. android:scaleType="fitXY"/>
  13. <LinearLayoutandroid:orientation="vertical"
  14. android:layout_width="wrap_content"
  15. android:layout_height="wrap_content">
  16. <TextViewandroid:id="@+id/name"
  17. android:layout_width="wrap_content"
  18. android:layout_height="wrap_content"
  19. android:textColor="#FFFFFF00"
  20. android:textSize="22px"/>
  21. <TextViewandroid:id="@+id/info"
  22. android:layout_width="wrap_content"
  23. android:layout_height="wrap_content"
  24. android:textColor="#FF00FFFF"
  25. android:textSize="13px"/>
  26. </LinearLayout>
  27. </LinearLayout>

看看效果:

原形状态 增加进去后

全部代码

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

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

[java] view plain copy
  1. setContentView(R.layout.activity_main);
  2. finalLayoutInflaterinflater=LayoutInflater.from(this);
  3. //获取需要被添加控件的布局
  4. finalLinearLayoutlin=(LinearLayout)findViewById(R.id.mainLinearLayout);
  5. //获取需要添加的布局
  6. LinearLayoutlayout=(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.LayoutParamslp=newLinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT);
  2. lp.setMargins(10,20,30,40);
  3. imageView.setLayoutParams(lp);

2、设置layout_weight:

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

例如:

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




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

请大家尊重原创者版权,转载请标明出处:http://www.52php.cn/article/p-ftqkgfos-bae.html 谢谢!!!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读