Android创建运行时视图不使用设备宽度和高度

时间:2018-04-27 05:32:08

标签: android android-layout react-native-android

我通过使用api的left和top值动态创建布局。 api数据如下所示: -

@Entity
public class Person {
   private String name;
   private String login;
   private String mail;
   private List<PersonTeam> teams;
}

public class PersonTeam {
    private String teamId;
    private String teamName;
}

我编写的用于创建布局的代码是:

{
"isSuccess": true,
"data": [{
        "left": "159",
        "top": "17",
        "seat_name": "Staff"
    },
    {
        "left": "159",
        "top": "65",
        "seat_name": "Staff"
    },
    {
        "left": "238",
        "top": "15",
        "seat_name": "3"
    },
    {
        "left": "239",
        "top": "66",
        "seat_name": "4"
    },
    {
        "left": "313",
        "top": "13",
        "seat_name": "5"
    },
    {
        "left": "314",
        "top": "67",
        "seat_name": "6"
    },
    {
        "left": "241",
        "top": "223",
        "seat_name": "7"
    },
    {
        "left": "239",
        "top": "160",
        "seat_name": "8"
    },
    {
        "left": "314",
        "top": "159",
        "seat_name": "9"
    },
    {
        "left": "315",
        "top": "223",
        "seat_name": "10"
    },
    {
        "left": "366",
        "top": "223",
        "seat_name": "11"
    },
    {
        "left": "364",
        "top": "160",
        "seat_name": "12"
    },
    {
        "left": "374",
        "top": "71",
        "seat_name": "13"
    },
    {
        "left": "371",
        "top": "12",
        "seat_name": "14"
    },
    {
        "left": "430",
        "top": "12",
        "seat_name": "15"
    },
    {
        "left": "432",
        "top": "68",
        "seat_name": "16"
    },
    {
        "left": "428",
        "top": "158",
        "seat_name": "17"
    },
    {
        "left": "431",
        "top": "223",
        "seat_name": "18"
    },
    {
        "left": "493",
        "top": "12",
        "seat_name": "19"
    },
    {
        "left": "492",
        "top": "64",
        "seat_name": "20"
    },
    {
        "left": "491",
        "top": "158",
        "seat_name": "21"
    },
    {
        "left": "486",
        "top": "222",
        "seat_name": "22"
    },
    {
        "left": "555",
        "top": "14",
        "seat_name": "23"
    },
    {
        "left": "553",
        "top": "65",
        "seat_name": "24"
    },
    {
        "left": "553",
        "top": "160",
        "seat_name": "25"
    },
    {
        "left": "553",
        "top": "220",
        "seat_name": "26"
    },
    {
        "left": "616",
        "top": "16",
        "seat_name": "27"
    },
    {
        "left": "618",
        "top": "65",
        "seat_name": "28"
    },
    {
        "left": "620",
        "top": "117",
        "seat_name": "29"
    },
    {
        "left": "618",
        "top": "166",
        "seat_name": "30"
    },
    {
        "left": "619",
        "top": "216",
        "seat_name": "31"
    }
]}

所以使用上面的代码,我得到的输出如下(几乎完美)。只是在每个项目之间存在间距问题:

enter image description here

注意:我已经通过在视图上应用绝对位置参数在React Native中实现了这个api。它已在许多Android设备上完美展示了UI,我已对其进行了测试。

所以我的问题是:

  1. 将布局parmas设置为MATCH_PARENT / FILL_PARENT后,为什么布局不占用设备的宽度和高度? (还尝试使用固定布局值,如120dp的宽度和高度。)
  2. 当我尝试为每个项目设置背景时,可以看到每个项目与其对应的项目重叠。不知道为什么?
  3. 我在上面的代码中做错了吗?

1 个答案:

答案 0 :(得分:2)

首先,您需要获得放置座位的视图大小。 简单方法 - 获得显示宽度和高度:

Point size = new Point();
display.getSize(size);
int width = size.x;
int height = size.y;

但这很难维护(你没有机会把它移到其他容器) 更好的方法 - 创建自定义ViewGroup(例如FrameLayout)并覆盖onMeasure / onLayout方法,请参阅How to size an Android view based on its parent's dimensions

获得尺码后,您必须重新计算位置。 首先获得最大左上角和最大上限。 比计算比例系数。例如,如果screan宽度为600,则最大左点为250,座位宽度为100,而比例宽度系数为(600-100)/ 250 = 2 然后使用系数添加所有座位:

objItemParams.setMargins(objSeat.getIntTop() * scaleCoefWidth, objSeat.getIntLeft() * scaleCoefHeigth, 0, 0);

注意,如果你想将它添加到垂直滚动而不是需要更改获取高度的逻辑(例如,如果座位数小于10,则在screan上绘制所有内容,如果超过10,则必须是高度超过屏幕(或ViewGroup)高度以允许垂直滚动。