频道栏目
首页 > 程序开发 > 移动开发 > Android > 正文
android开发怎么通过代码动态添加和删除控件
2018-05-14 01:37:52      个评论    来源:qq_36408196的博客  
收藏   我要投稿

1.概述

android开发当中有可能会碰到以下这种情况,某个页面,内容不确定,根据用户需求增加或减少相应控件数。这种情况一般发生在编辑类页面当中,比如你的应用包含用户发帖功能,其内容组织结构和多少是可变的。

本文实现了一个动态添加和删除控件的简单例子!先上截图:

截图1\

\\

\\

2.代码实现

(1)布局文件activity_main.xml

[html]view plaincopy
  1.  
  2. android:layout_width="match_parent"
  3. android:layout_height="match_parent"
  4. android:background="@android:color/darker_gray"
  5. tools:context=".MainActivity">
  6.  
  7. android:layout_width="match_parent"
  8. android:layout_height="match_parent"
  9. android:scrollbars="none">
  10. android:id="@+id/content_view"
  11. android:layout_width="match_parent"
  12. android:layout_height="wrap_content"
  13. android:isScrollContainer="true"
  14. android:orientation="vertical"
  15. android:padding="10.0dip">
  16. android:id="@+id/ll_one"
  17. android:layout_width="match_parent"
  18. android:layout_height="wrap_content"
  19. android:layout_marginTop="5dip"
  20. android:background="#FFA2CD5A"
  21. android:orientation="vertical"
  22. android:padding="5dip">
  23.  
  24. android:id="@+id/et_content1"
  25. android:layout_width="match_parent"
  26. android:layout_height="80dip"
  27. android:background="#FFFFFFFF"
  28. android:gravity="left"
  29. android:inputType="textMultiLine"
  30. android:paddingLeft="5dip"
  31. android:textSize="16sp"/>
  32.  
  33. android:layout_width="match_parent"
  34. android:layout_height="wrap_content"
  35. android:layout_marginTop="5dip">
  36. android:id="@+id/ibn_add1"
  37. android:layout_width="wrap_content"
  38. android:layout_height="wrap_content"
  39. android:layout_alignParentRight="true"
  40. android:background="@drawable/ic_add"/>
  41.  
  42.  

  43. 简单来讲,一个ScrollView和内嵌的LinearLayout的组合实现了本例。LinearLayout内部控件可增可减,因为其包含在ScrollView里,所以内容超出页面显示范围时可以滚动。该布局文件显示效果如上面第一个截图所示,包含一个编辑框(EditText)和“添加”按钮。

    (2)MainActivity文件

    [java]view plaincopy
    1. packagecom.example.androiddynamiclayout;
    2. importjava.util.LinkedList;
    3. importandroid.os.Bundle;
    4. importandroid.app.Activity;
    5. importandroid.graphics.Color;
    6. importandroid.text.InputType;
    7. importandroid.view.Gravity;
    8. importandroid.view.Menu;
    9. importandroid.view.View;
    10. importandroid.view.ViewGroup;
    11. importandroid.widget.EditText;
    12. importandroid.widget.ImageButton;
    13. importandroid.widget.LinearLayout;
    14. importandroid.widget.RelativeLayout;
    15.  
    16. publicclassMainActivityextendsActivity{
    17.  
    18. //外围的LinearLayout容器
    19. privateLinearLayoutllContentView;
    20. privateEditTextetContent1;
    21. //“+”按钮控件List
    22. privateLinkedListlistIBTNAdd;
    23. //“+”按钮ID索引
    24. privateintbtnIDIndex=1000;
    25. //“-”按钮控件List
    26. privateLinkedListlistIBTNDel;
    27.  
    28. privateintiETContentHeight=0;//EditText控件高度
    29. privatefloatfDimRatio=1.0f;//尺寸比例(实际尺寸/xml文件里尺寸)
    30. @Override
    31. protectedvoidonCreate(BundlesavedInstanceState){
    32. super.onCreate(savedInstanceState);
    33. setContentView(R.layout.activity_main);
    34.  
    35. initCtrl();
    36. }
    37. /**
    38. *初始化控件
    39. */
    40. privatevoidinitCtrl()
    41. {
    42. llContentView=(LinearLayout)this.findViewById(R.id.content_view);
    43. etContent1=(EditText)this.findViewById(R.id.et_content1);
    44. listIBTNAdd=newLinkedList();
    45. listIBTNDel=newLinkedList();
    46. //“+”按钮(第一个)
    47. ImageButtonibtnAdd1=(ImageButton)this.findViewById(R.id.ibn_add1);
    48. ibtnAdd1.setOnClickListener(newView.OnClickListener(){
    49. @Override
    50. publicvoidonClick(Viewv){
    51. //获取尺寸变化比例
    52. iETContentHeight=etContent1.getHeight();
    53. fDimRatio=iETContentHeight/80;
    54. addContent(v);
    55. }
    56. });
    57. listIBTNAdd.add(ibtnAdd1);
    58. listIBTNDel.add(null);//第一组隐藏了“-”按钮,所以为null
    59. }
    60. /**
    61. *添加一组新控件
    62. *@paramv事件触发控件,其实就是触发添加事件对应的“+”按钮
    63. */
    64. privatevoidaddContent(Viewv){
    65. if(v==null){
    66. return;
    67. }
    68.  
    69. //判断第几个“+”按钮触发了事件
    70. intiIndex=-1;
    71. for(inti=0;iif(listIBTNAdd.get(i)==v){
    72. iIndex=i;
    73. break;
    74. }
    75. }
    76. if(iIndex>=0){
    77. //控件实际添加位置为当前触发位置点下一位
    78. iIndex+=1;
    79. //开始添加控件
    80. //1.创建外围LinearLayout控件
    81. LinearLayoutlayout=newLinearLayout(MainActivity.this);
    82. LinearLayout.LayoutParamslLayoutlayoutParams=newLinearLayout.LayoutParams(
    83. ViewGroup.LayoutParams.MATCH_PARENT,
    84. ViewGroup.LayoutParams.WRAP_CONTENT);
    85. //设置margin
    86. lLayoutlayoutParams.setMargins(0,(int)(fDimRatio*5),0,0);
    87. layout.setLayoutParams(lLayoutlayoutParams);
    88. //设置属性
    89. layout.setBackgroundColor(Color.argb(255,162,205,90));//#FFA2CD5A
    90. layout.setPadding((int)(fDimRatio*5),(int)(fDimRatio*5),
    91. (int)(fDimRatio*5),(int)(fDimRatio*5));
    92. layout.setOrientation(LinearLayout.VERTICAL);
    93. //2.创建内部EditText控件
    94. EditTextetContent=newEditText(MainActivity.this);
    95. LinearLayout.LayoutParamsetParam=newLinearLayout.LayoutParams(
    96. ViewGroup.LayoutParams.MATCH_PARENT,iETContentHeight);
    97. etContent.setLayoutParams(etParam);
    98. //设置属性
    99. etContent.setBackgroundColor(Color.argb(255,255,255,255));//#FFFFFFFF
    100. etContent.setGravity(Gravity.LEFT);
    101. etContent.setInputType(InputType.TYPE_TEXT_FLAG_MULTI_LINE);
    102. etContent.setPadding((int)(fDimRatio*5),0,0,0);
    103. etContent.setTextSize(16);
    104. //将EditText放到LinearLayout里
    105. layout.addView(etContent);
    106. //3.创建“+”和“-”按钮外围控件RelativeLayout
    107. RelativeLayoutrlBtn=newRelativeLayout(MainActivity.this);
    108. RelativeLayout.LayoutParamsrlParam=newRelativeLayout.LayoutParams(
    109. ViewGroup.LayoutParams.MATCH_PARENT,
    110. ViewGroup.LayoutParams.WRAP_CONTENT);
    111. //rlParam.setMargins(0,(int)(fDimRatio*5),0,0);
    112. rlBtn.setPadding(0,(int)(fDimRatio*5),0,0);
    113. rlBtn.setLayoutParams(rlParam);
    114.  
    115. //4.创建“+”按钮
    116. ImageButtonbtnAdd=newImageButton(MainActivity.this);
    117. RelativeLayout.LayoutParamsbtnAddParam=newRelativeLayout.LayoutParams(
    118. ViewGroup.LayoutParams.WRAP_CONTENT,
    119. ViewGroup.LayoutParams.WRAP_CONTENT);
    120. //靠右放置
    121. btnAddParam.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
    122. btnAdd.setLayoutParams(btnAddParam);
    123. //设置属性
    124. btnAdd.setBackgroundResource(R.drawable.ic_add);
    125. btnAdd.setId(btnIDIndex);
    126. //设置点击操作
    127. btnAdd.setOnClickListener(newView.OnClickListener(){
    128.  
    129. @Override
    130. publicvoidonClick(Viewv){
    131. addContent(v);
    132. }
    133. });
    134. //将“+”按钮放到RelativeLayout里
    135. rlBtn.addView(btnAdd);
    136. listIBTNAdd.add(iIndex,btnAdd);
    137. //5.创建“-”按钮
    138. ImageButtonbtnDelete=newImageButton(MainActivity.this);
    139. btnDelete.setBackgroundResource(R.drawable.ic_delete);
    140. RelativeLayout.LayoutParamsbtnDeleteAddParam=newRelativeLayout.LayoutParams(
    141. ViewGroup.LayoutParams.WRAP_CONTENT,
    142. ViewGroup.LayoutParams.WRAP_CONTENT);
    143. btnDeleteAddParam.setMargins(0,0,(int)(fDimRatio*5),0);
    144. //“-”按钮放在“+”按钮左侧
    145. btnDeleteAddParam.addRule(RelativeLayout.LEFT_OF,btnIDIndex);
    146. btnDelete.setOnClickListener(newView.OnClickListener(){
    147.  
    148. @Override
    149. publicvoidonClick(Viewv){
    150. deleteContent(v);
    151. }
    152. });
    153. //将“-”按钮放到RelativeLayout里
    154. rlBtn.addView(btnDelete,btnDeleteAddParam);
    155. listIBTNDel.add(iIndex,btnDelete);
    156. //6.将RelativeLayout放到LinearLayout里
    157. layout.addView(rlBtn);
    158.  
    159. //7.将layout同它内部的所有控件加到最外围的llContentView容器里
    160. llContentView.addView(layout,iIndex);
    161. btnIDIndex++;
    162. }
    163. }
    164. /**
    165. *删除一组控件
    166. *@paramv事件触发控件,其实就是触发删除事件对应的“-”按钮
    167. */
    168. privatevoiddeleteContent(Viewv){
    169. if(v==null){
    170. return;
    171. }
    172.  
    173. //判断第几个“-”按钮触发了事件
    174. intiIndex=-1;
    175. for(inti=0;iif(listIBTNDel.get(i)==v){
    176. iIndex=i;
    177. break;
    178. }
    179. }
    180. if(iIndex>=0){
    181. listIBTNAdd.remove(iIndex);
    182. listIBTNDel.remove(iIndex);
    183.  
    184. //从外围llContentView容器里删除第iIndex控件
    185. llContentView.removeViewAt(iIndex);
    186. }
    187. }
    188. /*@Override
    189. publicbooleanonCreateOptionsMenu(Menumenu){
    190. //Inflatethemenu;thisaddsitemstotheactionbarifitispresent.
    191. getMenuInflater().inflate(R.menu.activity_main,menu);
    192. returntrue;
    193. } */
    194.  
    195. }
      浏览这段代码需要注意以下几两点:1.llContentView:这个变量对应的是上面布局文件提到的那个LinearLayout,通过llContentView.addView(layout, iIndex)往某一位置添加子控件,通过llContentView.removeViewAt(iIndex)删除某一位置上的子控件。2.List对象listIBTNAdd和listIBTNDel:存储了当前所包含的所有“添加”和“删除”按钮对象,在发生添加或删除事件时,用于定位触发事件位置。
点击复制链接 与好友分享!回本站首页
上一篇:Android组件化+Arouter通讯解析
下一篇:android 6.0动态权限适配工具解析
相关文章
图文推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站