android 使用相对布局制作动态视图时面临的问题

qyswt5oh  于 2023-06-27  发布在  Android
关注(0)|答案(1)|浏览(172)

bounty已结束。此问题的答案有资格获得+50声望奖励。赏金宽限期16小时后结束。IRON MAN正在寻找一个规范答案

我正在使用相对布局来动态构建视图/网格...
例如:如果有1个用户,
[ grid with users 1 ] 1
如果有2个用户,
[ grid with users 2 ] 2
如果有3个用户,
[ grid with user 3 ] 3
如果有4个用户,则上面2个,下面2个
如果有5个,则[grid with user 5] 4
如果有6个。[ grid with user 6 ] 5
我的准则是

  1. private RelativeLayout.LayoutParams[] getgrid(int size) {
  2. int width = Math.max(getMeasuredWidth(),getMeasuredHeight());
  3. int height = Math.min(getMeasuredWidth(),getMeasuredHeight());
  4. RelativeLayout.LayoutParams[] array =
  5. new RelativeLayout.LayoutParams[size];
  6. for (int i = 0; i < size; i++) {
  7. if (i == 0) {
  8. array[0] = new RelativeLayout.LayoutParams(
  9. LayoutParams.MATCH_PARENT,
  10. LayoutParams.MATCH_PARENT);
  11. array[0].addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE);
  12. } else if (i == 1) {
  13. array[1] = new RelativeLayout.LayoutParams(width / 2, height);
  14. array[0].width = array[1].width;
  15. array[1].addRule(RelativeLayout.RIGHT_OF, mUserViewList.get(mUidList.get(0)).getId());
  16. array[1].addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE);
  17. // array[1].addRule(RelativeLayout.ALIGN_PARENT_BOTTOM,RelativeLayout.TRUE);
  18. } else if (i == 2) {
  19. array[i] = new RelativeLayout.LayoutParams(width / 3, height);
  20. array[1].width = array[i].width;
  21. array[0].width = array[i].width;
  22. //array[i].addRule(RelativeLayout.ALIGN_PARENT_RIGHT, RelativeLayout.TRUE);
  23. array[i].addRule(RelativeLayout.RIGHT_OF, mUserViewList.get(mUidList.get(1)).getId());
  24. } else if (i == 3) {
  25. array[i] = new RelativeLayout.LayoutParams(width / 2, height / 2);
  26. array[0].width = array[i].width;
  27. array[1].width = array[i].width;
  28. array[i - 1].width = array[i].width;
  29. array[0].height = array[i].height;
  30. array[1].height = array[i].height;
  31. array[i - 1].height = array[i].height;
  32. array[i - 1].addRule(RelativeLayout.ALIGN_PARENT_LEFT, RelativeLayout.TRUE);
  33. array[i].addRule(RelativeLayout.ALIGN_PARENT_RIGHT, 0);
  34. array[i - 1].addRule(RelativeLayout.BELOW, mUserViewList.get(mUidList.get(0)).getId());
  35. array[i].addRule(RelativeLayout.BELOW, mUserViewList.get(mUidList.get(1)).getId());
  36. array[i].addRule(RelativeLayout.RIGHT_OF, mUserViewList.get(mUidList.get(i - 1)).getId());
  37. } else if (i == 4) {
  38. array[i] = new RelativeLayout.LayoutParams(width / 3, height / 2);
  39. array[0].width = array[i].width;
  40. array[1].width = array[i].width;
  41. array[2].width = array[i].width;
  42. array[3].width = array[i].width;
  43. array[0].setMargins(width / 6, 0, 0, 0);
  44. array[i].addRule(RelativeLayout.RIGHT_OF, mUserViewList.get(mUidList.get(i - 1)).getId());
  45. array[i].addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE);
  46. } else if (i == 5) {
  47. array[i] = new RelativeLayout.LayoutParams(width / 3, height / 2);
  48. array[0].setMargins(0, 0, 0, 0);
  49. array[i].addRule(RelativeLayout.RIGHT_OF, mUserViewList.get(mUidList.get(1)).getId());
  50. array[i].addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE);
  51. }
  52. }
  53. return array;
  54. }

问题是有另一个视图的权利,除了相对布局,所以基本上它没有得到平等的划分和扭曲,以及(扭曲意味着一些网格没有覆盖整个高度)
请参考:-- [issue with 6] 6
[issue with 3] 7
请帮助我提前感谢

sf6xfgos

sf6xfgos1#


为了使动态视图如您所见,我编写了以下代码:
注意:5视图有一个例外,因为它需要 Package 在另一个视图中(在我的例子中,线性布局)。
当前,相对布局的宽度和高度固定如下:

  1. android:layout_width="match_parent"
  2. android:layout_height="200dp"

整个活动代码:

  1. public class MainActivity2 extends AppCompatActivity {
  2. RelativeLayout relativeLayout;
  3. List<UserView> mUserViewList;
  4. List<Integer> mUidList;
  5. @Override
  6. protected void onCreate(Bundle savedInstanceState) {
  7. super.onCreate(savedInstanceState);
  8. setContentView(R.layout.activity_main2);
  9. relativeLayout = findViewById(R.id.relativeLayout);
  10. mUserViewList = new ArrayList<>();
  11. mUidList = new ArrayList<>();
  12. int size = 5;
  13. RelativeLayout.LayoutParams[] array = getgrid2(size);
  14. for (int i = 0; i < size; i++) {
  15. //createing user view and addding in view list
  16. UserView userView = new UserView(this);
  17. mUserViewList.add(userView);
  18. //setting id and addint to id list
  19. userView.setId(i);
  20. mUidList.add(i);
  21. //settting text to user view
  22. userView.setTextView("User " + (i+1));
  23. if (array[i]==null)
  24. continue;
  25. //setting layout
  26. mUserViewList.get(i).setLayoutParams(array[i]);
  27. //adding to views
  28. if (i==4){
  29. relativeLayout.addView(exptionalMethodFor5view());
  30. }
  31. relativeLayout.addView(mUserViewList.get(i));
  32. }
  33. }
  34. private RelativeLayout.LayoutParams[] getgrid2(int size) {
  35. // int width = Math.max(relativeLayout.getMeasuredWidth(),relativeLayout.getMeasuredHeight());
  36. // int height = Math.min(relativeLayout.getMeasuredWidth(),relativeLayout.getMeasuredHeight());
  37. int width = Resources.getSystem().getDisplayMetrics().widthPixels;
  38. int height =dpToPx(200);
  39. RelativeLayout.LayoutParams[] array =
  40. new RelativeLayout.LayoutParams[size];
  41. switch (size){
  42. case 1: {
  43. array[0] = new RelativeLayout.LayoutParams(
  44. RelativeLayout.LayoutParams.MATCH_PARENT,
  45. RelativeLayout.LayoutParams.MATCH_PARENT);
  46. array[0].addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE);
  47. break;
  48. }
  49. case 2:{
  50. array[0] = new RelativeLayout.LayoutParams(
  51. width/2,
  52. RelativeLayout.LayoutParams.MATCH_PARENT );
  53. array[0].addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE);
  54. array[0].addRule(RelativeLayout.ALIGN_PARENT_START, RelativeLayout.TRUE);
  55. array[1] = new RelativeLayout.LayoutParams(
  56. width/2,
  57. ViewGroup.LayoutParams.MATCH_PARENT);
  58. array[1].addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE);
  59. array[1].addRule(RelativeLayout.ALIGN_PARENT_END, RelativeLayout.TRUE);
  60. break;
  61. }
  62. case 3: {
  63. array[0] = new RelativeLayout.LayoutParams(
  64. width/3,
  65. RelativeLayout.LayoutParams.MATCH_PARENT );
  66. array[0].addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE);
  67. array[0].addRule(RelativeLayout.ALIGN_PARENT_START, RelativeLayout.TRUE);
  68. array[1] = new RelativeLayout.LayoutParams(
  69. width/3,
  70. ViewGroup.LayoutParams.MATCH_PARENT);
  71. array[1].addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE);
  72. array[1].addRule(RelativeLayout.ALIGN_PARENT_END, RelativeLayout.TRUE);
  73. array[2] = new RelativeLayout.LayoutParams(
  74. width/3,
  75. ViewGroup.LayoutParams.MATCH_PARENT);
  76. array[2].addRule(RelativeLayout.CENTER_IN_PARENT, RelativeLayout.TRUE);
  77. break;
  78. }
  79. case 4: {
  80. array[0] = new RelativeLayout.LayoutParams(
  81. width/2,
  82. height/2 );
  83. array[0].addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE);
  84. array[0].addRule(RelativeLayout.ALIGN_PARENT_START, RelativeLayout.TRUE);
  85. array[1] = new RelativeLayout.LayoutParams(
  86. width/2,
  87. height/2);
  88. array[1].addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE);
  89. array[1].addRule(RelativeLayout.ALIGN_PARENT_END, RelativeLayout.TRUE);
  90. array[2] = new RelativeLayout.LayoutParams(
  91. width/2,
  92. height/2);
  93. array[2].addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE);
  94. array[3] = new RelativeLayout.LayoutParams(
  95. width/2,
  96. height/2);
  97. array[3].addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE);
  98. array[3].addRule(RelativeLayout.ALIGN_PARENT_END, RelativeLayout.TRUE);
  99. break;
  100. }
  101. case 5: {
  102. // array[0] = new RelativeLayout.LayoutParams(
  103. // width/3,
  104. // height/2 );
  105. // array[0].addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE);
  106. // array[0].addRule(RelativeLayout.ALIGN_PARENT_START, RelativeLayout.TRUE);
  107. // array[1] = new RelativeLayout.LayoutParams(
  108. // width/3,
  109. // height/2);
  110. //top right
  111. // array[1].addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE);
  112. // array[1].addRule(RelativeLayout.ALIGN_PARENT_END, RelativeLayout.TRUE);
  113. array[2] = new RelativeLayout.LayoutParams(
  114. width/3,
  115. height/2);
  116. array[2].addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE);
  117. array[3] = new RelativeLayout.LayoutParams(
  118. width/3,
  119. height/2);
  120. array[3].addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE);
  121. array[3].addRule(RelativeLayout.ALIGN_PARENT_END, RelativeLayout.TRUE);
  122. array[4] = new RelativeLayout.LayoutParams(
  123. width/3,
  124. height/2);
  125. array[4].addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE);
  126. array[4].addRule(RelativeLayout.CENTER_HORIZONTAL, RelativeLayout.TRUE);
  127. break;
  128. }
  129. case 6: {
  130. array[0] = new RelativeLayout.LayoutParams(
  131. width/3,
  132. height/2 );
  133. array[0].addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE);
  134. array[0].addRule(RelativeLayout.ALIGN_PARENT_START, RelativeLayout.TRUE);
  135. array[1] = new RelativeLayout.LayoutParams(
  136. width/3,
  137. height/2);
  138. array[1].addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE);
  139. array[1].addRule(RelativeLayout.ALIGN_PARENT_END, RelativeLayout.TRUE);
  140. array[2] = new RelativeLayout.LayoutParams(
  141. width/3,
  142. height/2);
  143. array[2].addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE);
  144. array[3] = new RelativeLayout.LayoutParams(
  145. width/3,
  146. height/2);
  147. array[3].addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE);
  148. array[3].addRule(RelativeLayout.ALIGN_PARENT_END, RelativeLayout.TRUE);
  149. array[4] = new RelativeLayout.LayoutParams(
  150. width/3,
  151. height/2);
  152. array[4].addRule(RelativeLayout.CENTER_HORIZONTAL, RelativeLayout.TRUE);
  153. array[5] = new RelativeLayout.LayoutParams(
  154. width/3,
  155. height/2);
  156. array[5].addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE);
  157. array[5].addRule(RelativeLayout.CENTER_HORIZONTAL, RelativeLayout.TRUE);
  158. break;
  159. }
  160. default:{
  161. array[0] = new RelativeLayout.LayoutParams(
  162. width/2,
  163. ViewGroup.LayoutParams.MATCH_PARENT);
  164. array[0].addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE);
  165. array[0].addRule(RelativeLayout.ALIGN_PARENT_START, RelativeLayout.TRUE);
  166. array[1] = new RelativeLayout.LayoutParams(
  167. width/2,
  168. ViewGroup.LayoutParams.MATCH_PARENT);
  169. array[1].addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE);
  170. array[1].addRule(RelativeLayout.ALIGN_PARENT_END, RelativeLayout.TRUE);
  171. break;
  172. }
  173. }
  174. return array;
  175. }
  176. private LinearLayout exptionalMethodFor5view(){
  177. LinearLayout linearLayout = new LinearLayout(this);
  178. LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
  179. LinearLayout.LayoutParams.MATCH_PARENT,
  180. LinearLayout.LayoutParams.WRAP_CONTENT);
  181. linearLayout.setOrientation(LinearLayout.HORIZONTAL);
  182. linearLayout.setGravity(Gravity.CENTER);
  183. linearLayout.setLayoutParams(layoutParams);
  184. UserView newUserview1 = new UserView(this);
  185. newUserview1.setLayoutParams(new LinearLayout.LayoutParams(
  186. (Resources.getSystem().getDisplayMetrics().widthPixels)/3,
  187. dpToPx(200)/2));
  188. UserView newUserview2 = new UserView(this);
  189. newUserview2.setLayoutParams(new LinearLayout.LayoutParams(
  190. (Resources.getSystem().getDisplayMetrics().widthPixels)/3,
  191. dpToPx(200)/2));
  192. linearLayout.addView(newUserview1);
  193. linearLayout.addView(newUserview2);
  194. return linearLayout;
  195. }
  196. public static int dpToPx(float dp) {
  197. float density = Resources.getSystem().getDisplayMetrics().density;
  198. return Math.round(dp * density);
  199. }
  200. }
展开查看全部

相关问题