英文:
Facing issue While making dynamic views using Relative layout
问题
我正在使用相对布局来动态构建视图/网格...
例如:如果有1个用户,
如果有2个用户,
如果有3个用户,
如果有4个用户,
2个在上面,2个在下面
我的代码如下:
private RelativeLayout.LayoutParams[] getgrid(int size) {
int width = Math.max(getMeasuredWidth(),getMeasuredHeight());
int height = Math.min(getMeasuredWidth(),getMeasuredHeight());
RelativeLayout.LayoutParams[] array =
new RelativeLayout.LayoutParams[size];
for (int i = 0; i < size; i++) {
if (i == 0) {
array[0] = new RelativeLayout.LayoutParams(
LayoutParams.MATCH_PARENT,
LayoutParams.MATCH_PARENT);
array[0].addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE);
} else if (i == 1) {
array[1] = new RelativeLayout.LayoutParams(width / 2, height);
array[0].width = array[1].width;
array[1].addRule(RelativeLayout.RIGHT_OF, mUserViewList.get(mUidList.get(0)).getId());
array[1].addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE);
// array[1].addRule(RelativeLayout.ALIGN_PARENT_BOTTOM,RelativeLayout.TRUE);
} else if (i == 2) {
array[i] = new RelativeLayout.LayoutParams(width / 3, height);
array[1].width = array[i].width;
array[0].width = array[i].width;
//array[i].addRule(RelativeLayout.ALIGN_PARENT_RIGHT, RelativeLayout.TRUE);
array[i].addRule(RelativeLayout.RIGHT_OF, mUserViewList.get(mUidList.get(1)).getId());
} else if (i == 3) {
array[i] = new RelativeLayout.LayoutParams(width / 2, height / 2);
array[0].width = array[i].width;
array[1].width = array[i].width;
array[i - 1].width = array[i].width;
array[0].height = array[i].height;
array[1].height = array[i].height;
array[i - 1].height = array[i].height;
array[i - 1].addRule(RelativeLayout.ALIGN_PARENT_LEFT, RelativeLayout.TRUE);
array[i].addRule(RelativeLayout.ALIGN_PARENT_RIGHT, 0);
array[i - 1].addRule(RelativeLayout.BELOW, mUserViewList.get(mUidList.get(0)).getId());
array[i].addRule(RelativeLayout.BELOW, mUserViewList.get(mUidList.get(1)).getId());
array[i].addRule(RelativeLayout.RIGHT_OF, mUserViewList.get(mUidList.get(i - 1)).getId());
} else if (i == 4) {
array[i] = new RelativeLayout.LayoutParams(width / 3, height / 2);
array[0].width = array[i].width;
array[1].width = array[i].width;
array[2].width = array[i].width;
array[3].width = array[i].width;
array[0].setMargins(width / 6, 0, 0, 0);
array[i].addRule(RelativeLayout.RIGHT_OF, mUserViewList.get(mUidList.get(i - 1)).getId());
array[i].addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE);
} else if (i == 5) {
array[i] = new RelativeLayout.LayoutParams(width / 3, height / 2);
array[0].setMargins(0, 0, 0, 0);
array[i].addRule(RelativeLayout.RIGHT_OF, mUserViewList.get(mUidList.get(1)).getId());
array[i].addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE);
}
}
return array;
}
问题在于相对布局旁边还有另一个视图,因此它不能均匀分布并且可能出现变形(变形意味着某些网格没有覆盖到整个高度)。
请提供帮助,提前感谢。
英文:
I'm using relative layout for building the views/grid dynamically...
ex: if there is 1 user then,
if there is 2 user then ,
if there is 3 user then,
if there are 4 user then ,
2 above and 2 below
if there are 5 then,
[grid with user 5]4
if there are 6 then.
[grid with user 6]5
my code is ,
private RelativeLayout.LayoutParams[] getgrid(int size) {
int width = Math.max(getMeasuredWidth(),getMeasuredHeight());
int height = Math.min(getMeasuredWidth(),getMeasuredHeight());
RelativeLayout.LayoutParams[] array =
new RelativeLayout.LayoutParams[size];
for (int i = 0; i < size; i++) {
if (i == 0) {
array[0] = new RelativeLayout.LayoutParams(
LayoutParams.MATCH_PARENT,
LayoutParams.MATCH_PARENT);
array[0].addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE);
} else if (i == 1) {
array[1] = new RelativeLayout.LayoutParams(width / 2, height);
array[0].width = array[1].width;
array[1].addRule(RelativeLayout.RIGHT_OF, mUserViewList.get(mUidList.get(0)).getId());
array[1].addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE);
// array[1].addRule(RelativeLayout.ALIGN_PARENT_BOTTOM,RelativeLayout.TRUE);
} else if (i == 2) {
array[i] = new RelativeLayout.LayoutParams(width / 3, height);
array[1].width = array[i].width;
array[0].width = array[i].width;
//array[i].addRule(RelativeLayout.ALIGN_PARENT_RIGHT, RelativeLayout.TRUE);
array[i].addRule(RelativeLayout.RIGHT_OF, mUserViewList.get(mUidList.get(1)).getId());
} else if (i == 3) {
array[i] = new RelativeLayout.LayoutParams(width / 2, height / 2);
array[0].width = array[i].width;
array[1].width = array[i].width;
array[i - 1].width = array[i].width;
array[0].height = array[i].height;
array[1].height = array[i].height;
array[i - 1].height = array[i].height;
array[i - 1].addRule(RelativeLayout.ALIGN_PARENT_LEFT, RelativeLayout.TRUE);
array[i].addRule(RelativeLayout.ALIGN_PARENT_RIGHT, 0);
array[i - 1].addRule(RelativeLayout.BELOW, mUserViewList.get(mUidList.get(0)).getId());
array[i].addRule(RelativeLayout.BELOW, mUserViewList.get(mUidList.get(1)).getId());
array[i].addRule(RelativeLayout.RIGHT_OF, mUserViewList.get(mUidList.get(i - 1)).getId());
} else if (i == 4) {
array[i] = new RelativeLayout.LayoutParams(width / 3, height / 2);
array[0].width = array[i].width;
array[1].width = array[i].width;
array[2].width = array[i].width;
array[3].width = array[i].width;
array[0].setMargins(width / 6, 0, 0, 0);
array[i].addRule(RelativeLayout.RIGHT_OF, mUserViewList.get(mUidList.get(i - 1)).getId());
array[i].addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE);
} else if (i == 5) {
array[i] = new RelativeLayout.LayoutParams(width / 3, height / 2);
array[0].setMargins(0, 0, 0, 0);
array[i].addRule(RelativeLayout.RIGHT_OF, mUserViewList.get(mUidList.get(1)).getId());
array[i].addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE);
}
}
return array;
}
the issue is there is another view right besides the relative layout so basically its not getting equally divided and distorted as well (distorted means some grid is not covering the full height)
please refer this:--
[issue with 6]6
[issue with 3]7
and so on
please help me out thanks in advance
答案1
得分: 1
为了使动态视图看起来像您所见,我编写了以下代码:
注意:第 5 个视图有一个例外,因为它需要包装在另一个视图内(在我的情况下是线性布局)。
当前,相对布局的宽度和高度如下固定:
android:layout_width="match_parent"
android:layout_height="200dp"
整个活动代码如下:
public class MainActivity2 extends AppCompatActivity {
RelativeLayout relativeLayout;
List<UserView> mUserViewList;
List<Integer> mUidList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
relativeLayout = findViewById(R.id.relativeLayout);
mUserViewList = new ArrayList<>();
mUidList = new ArrayList<>();
int size = 5;
RelativeLayout.LayoutParams[] array = getgrid2(size);
for (int i = 0; i < size; i++) {
// 创建用户视图并添加到视图列表
UserView userView = new UserView(this);
mUserViewList.add(userView);
// 设置 ID 并添加到 ID 列表
userView.setId(i);
mUidList.add(i);
// 设置用户视图的文本
userView.setTextView("User " + (i+1));
if (array[i] == null)
continue;
// 设置布局
mUserViewList.get(i).setLayoutParams(array[i]);
// 将视图添加到布局中
if (i == 4) {
relativeLayout.addView(exceptionalMethodFor5view());
}
relativeLayout.addView(mUserViewList.get(i));
}
}
// 其他方法和类的定义...
private LinearLayout exceptionalMethodFor5view() {
LinearLayout linearLayout = new LinearLayout(this);
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
linearLayout.setOrientation(LinearLayout.HORIZONTAL);
linearLayout.setGravity(Gravity.CENTER);
linearLayout.setLayoutParams(layoutParams);
UserView newUserview1 = new UserView(this);
newUserview1.setLayoutParams(new LinearLayout.LayoutParams(
(Resources.getSystem().getDisplayMetrics().widthPixels) / 3,
dpToPx(200) / 2));
UserView newUserview2 = new UserView(this);
newUserview2.setLayoutParams(new LinearLayout.LayoutParams(
(Resources.getSystem().getDisplayMetrics().widthPixels) / 3,
dpToPx(200) / 2));
linearLayout.addView(newUserview1);
linearLayout.addView(newUserview2);
return linearLayout;
}
public static int dpToPx(float dp) {
float density = Resources.getSystem().getDisplayMetrics().density;
return Math.round(dp * density);
}
}
这段代码涵盖了创建动态视图和设置其布局参数的过程。
英文:
To make Dynamic view as you see it, I wrote the following code:
Note: There is an exception for the 5 view because it needs to be wrapped inside another view (in my case, the linear layout).
Currently, the width and height of the relative layout are fixed as follows:
android:layout_width="match_parent"
android:layout_height="200dp"
whole activity code:
public class MainActivity2 extends AppCompatActivity {
RelativeLayout relativeLayout;
List<UserView> mUserViewList;
List<Integer> mUidList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
relativeLayout = findViewById(R.id.relativeLayout);
mUserViewList = new ArrayList<>();
mUidList = new ArrayList<>();
int size = 5;
RelativeLayout.LayoutParams[] array = getgrid2(size);
for (int i = 0; i < size; i++) {
//createing user view and addding in view list
UserView userView = new UserView(this);
mUserViewList.add(userView);
//setting id and addint to id list
userView.setId(i);
mUidList.add(i);
//settting text to user view
userView.setTextView("User " + (i+1));
if (array[i]==null)
continue;
//setting layout
mUserViewList.get(i).setLayoutParams(array[i]);
//adding to views
if (i==4){
relativeLayout.addView(exptionalMethodFor5view());
}
relativeLayout.addView(mUserViewList.get(i));
}
}
private RelativeLayout.LayoutParams[] getgrid2(int size) {
// int width = Math.max(relativeLayout.getMeasuredWidth(),relativeLayout.getMeasuredHeight());
// int height = Math.min(relativeLayout.getMeasuredWidth(),relativeLayout.getMeasuredHeight());
int width = Resources.getSystem().getDisplayMetrics().widthPixels;
int height =dpToPx(200);
RelativeLayout.LayoutParams[] array =
new RelativeLayout.LayoutParams[size];
switch (size){
case 1: {
array[0] = new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.MATCH_PARENT,
RelativeLayout.LayoutParams.MATCH_PARENT);
array[0].addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE);
break;
}
case 2:{
array[0] = new RelativeLayout.LayoutParams(
width/2,
RelativeLayout.LayoutParams.MATCH_PARENT );
array[0].addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE);
array[0].addRule(RelativeLayout.ALIGN_PARENT_START, RelativeLayout.TRUE);
array[1] = new RelativeLayout.LayoutParams(
width/2,
ViewGroup.LayoutParams.MATCH_PARENT);
array[1].addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE);
array[1].addRule(RelativeLayout.ALIGN_PARENT_END, RelativeLayout.TRUE);
break;
}
case 3: {
array[0] = new RelativeLayout.LayoutParams(
width/3,
RelativeLayout.LayoutParams.MATCH_PARENT );
array[0].addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE);
array[0].addRule(RelativeLayout.ALIGN_PARENT_START, RelativeLayout.TRUE);
array[1] = new RelativeLayout.LayoutParams(
width/3,
ViewGroup.LayoutParams.MATCH_PARENT);
array[1].addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE);
array[1].addRule(RelativeLayout.ALIGN_PARENT_END, RelativeLayout.TRUE);
array[2] = new RelativeLayout.LayoutParams(
width/3,
ViewGroup.LayoutParams.MATCH_PARENT);
array[2].addRule(RelativeLayout.CENTER_IN_PARENT, RelativeLayout.TRUE);
break;
}
case 4: {
array[0] = new RelativeLayout.LayoutParams(
width/2,
height/2 );
array[0].addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE);
array[0].addRule(RelativeLayout.ALIGN_PARENT_START, RelativeLayout.TRUE);
array[1] = new RelativeLayout.LayoutParams(
width/2,
height/2);
array[1].addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE);
array[1].addRule(RelativeLayout.ALIGN_PARENT_END, RelativeLayout.TRUE);
array[2] = new RelativeLayout.LayoutParams(
width/2,
height/2);
array[2].addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE);
array[3] = new RelativeLayout.LayoutParams(
width/2,
height/2);
array[3].addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE);
array[3].addRule(RelativeLayout.ALIGN_PARENT_END, RelativeLayout.TRUE);
break;
}
case 5: {
// array[0] = new RelativeLayout.LayoutParams(
// width/3,
// height/2 );
// array[0].addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE);
// array[0].addRule(RelativeLayout.ALIGN_PARENT_START, RelativeLayout.TRUE);
// array[1] = new RelativeLayout.LayoutParams(
// width/3,
// height/2);
//top right
// array[1].addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE);
// array[1].addRule(RelativeLayout.ALIGN_PARENT_END, RelativeLayout.TRUE);
array[2] = new RelativeLayout.LayoutParams(
width/3,
height/2);
array[2].addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE);
array[3] = new RelativeLayout.LayoutParams(
width/3,
height/2);
array[3].addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE);
array[3].addRule(RelativeLayout.ALIGN_PARENT_END, RelativeLayout.TRUE);
array[4] = new RelativeLayout.LayoutParams(
width/3,
height/2);
array[4].addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE);
array[4].addRule(RelativeLayout.CENTER_HORIZONTAL, RelativeLayout.TRUE);
break;
}
case 6: {
array[0] = new RelativeLayout.LayoutParams(
width/3,
height/2 );
array[0].addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE);
array[0].addRule(RelativeLayout.ALIGN_PARENT_START, RelativeLayout.TRUE);
array[1] = new RelativeLayout.LayoutParams(
width/3,
height/2);
array[1].addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE);
array[1].addRule(RelativeLayout.ALIGN_PARENT_END, RelativeLayout.TRUE);
array[2] = new RelativeLayout.LayoutParams(
width/3,
height/2);
array[2].addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE);
array[3] = new RelativeLayout.LayoutParams(
width/3,
height/2);
array[3].addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE);
array[3].addRule(RelativeLayout.ALIGN_PARENT_END, RelativeLayout.TRUE);
array[4] = new RelativeLayout.LayoutParams(
width/3,
height/2);
array[4].addRule(RelativeLayout.CENTER_HORIZONTAL, RelativeLayout.TRUE);
array[5] = new RelativeLayout.LayoutParams(
width/3,
height/2);
array[5].addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE);
array[5].addRule(RelativeLayout.CENTER_HORIZONTAL, RelativeLayout.TRUE);
break;
}
default:{
array[0] = new RelativeLayout.LayoutParams(
width/2,
ViewGroup.LayoutParams.MATCH_PARENT);
array[0].addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE);
array[0].addRule(RelativeLayout.ALIGN_PARENT_START, RelativeLayout.TRUE);
array[1] = new RelativeLayout.LayoutParams(
width/2,
ViewGroup.LayoutParams.MATCH_PARENT);
array[1].addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE);
array[1].addRule(RelativeLayout.ALIGN_PARENT_END, RelativeLayout.TRUE);
break;
}
}
return array;
}
private LinearLayout exptionalMethodFor5view(){
LinearLayout linearLayout = new LinearLayout(this);
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
linearLayout.setOrientation(LinearLayout.HORIZONTAL);
linearLayout.setGravity(Gravity.CENTER);
linearLayout.setLayoutParams(layoutParams);
UserView newUserview1 = new UserView(this);
newUserview1.setLayoutParams(new LinearLayout.LayoutParams(
(Resources.getSystem().getDisplayMetrics().widthPixels)/3,
dpToPx(200)/2));
UserView newUserview2 = new UserView(this);
newUserview2.setLayoutParams(new LinearLayout.LayoutParams(
(Resources.getSystem().getDisplayMetrics().widthPixels)/3,
dpToPx(200)/2));
linearLayout.addView(newUserview1);
linearLayout.addView(newUserview2);
return linearLayout;
}
public static int dpToPx(float dp) {
float density = Resources.getSystem().getDisplayMetrics().density;
return Math.round(dp * density);
}
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论