我正在使用API的左侧和顶部值动态创建布局。 API数据如下:
所以我的问题是:
{
"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"
}
]}
我编写的用于创建布局的代码如下:
private void createLayout() {
ScrollView objScrollView = new ScrollView(this);
ViewGroup.LayoutParams objLayoutParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.FILL_PARENT);
objScrollView.setLayoutParams(objLayoutParams);
RelativeLayout objParentLayout = new RelativeLayout(this);
RelativeLayout.LayoutParams objParentParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.FILL_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT);
int intId = 100;
int intLeft = 0;
for (int i = 0; i < arrobjSeats.size(); i++) {
Seat objSeat = arrobjSeats.get(i);
RelativeLayout objItemLayout = new RelativeLayout(this);
RelativeLayout.LayoutParams objItemParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
objItemParams.setMargins(objSeat.getIntTop() + 30, objSeat.getIntLeft() - 110, 0, 10);
intLeft = objSeat.getIntTop();
ImageView imgSeat = new ImageView(this);
imgSeat.setImageResource(R.drawable.ic_airline_seat_recline_normal_black_24dp);
imgSeat.setColorFilter(Color.parseColor(objSeat.getStrSeatColor()), android.graphics.PorterDuff.Mode.SRC_IN);
imgSeat.setPadding(5, 5, 10, 25);
imgSeat.setId(intId++);
RelativeLayout.LayoutParams objImageParams = new RelativeLayout.LayoutParams(120, 80);
objImageParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
TextView txtSeatName = new TextView(this);
RelativeLayout.LayoutParams objTextParams = new RelativeLayout.LayoutParams(120, RelativeLayout.LayoutParams.WRAP_CONTENT);
objTextParams.addRule(RelativeLayout.ALIGN_BOTTOM, imgSeat.getId());
txtSeatName.setPadding(5, 10, 5, 5);
txtSeatName.setTextColor(Color.parseColor(objSeat.getStrSeatColor()));
txtSeatName.setText(objSeat.getStrSeatName());
txtSeatName.setGravity(Gravity.CENTER);
txtSeatName.setTextSize(16);
objItemLayout.setTag(i);
objItemLayout.addView(imgSeat, objImageParams);
objItemLayout.addView(txtSeatName, objTextParams);
objItemLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int intPosition = (int) v.getTag();
Seat objSeat = arrobjSeats.get(intPosition);
Toast.makeText(SeatActivity.this, "Seat=>" + objSeat.getIntSeatId() + "=>" + objSeat.getStrSeatName(), Toast.LENGTH_SHORT).show();
}
});
objParentLayout.setBackgroundColor(Color.CYAN);
objParentLayout.addView(objItemLayout, objItemParams);
System.out.println("Final Color=>" + objSeat.getStrSeatColor());
}
objScrollView.addView(objParentLayout, objParentParams);
relativeLayout.addView(objScrollView);
}
所以使用上述代码,我得到的输出结果如下(几乎完美)。只是每个项目之间的间距有问题:
注意:我已经通过在视图上应用绝对位置参数,在React Native中实现了此API。它在许多Android设备上完美地显示,我已经进行了测试。所以我的问题是:
- 为什么布局在将布局参数设置为MATCH_PARENT/FILL_PARENT后没有占满整个设备的宽度和高度?(还尝试使用固定布局值,如给定120dp的宽度和高度。)
- 当我尝试为每个项目设置背景时,可以看到每个项目与其相应的项目重叠。不知道为什么?
objItemLayout
是wrap_content
,因为你没有设置任何LayoutParams
。除此之外,我建议使用布局 XML,并使用LayoutInflater
在运行时填充视图。在运行时排列视图将导致大量代码行,并且在某些情况下可能过于棘手。 - ADMrelativeLayout
是如何定义的?它似乎是您的顶层视图,但我不知道它在哪里定义。另外,您能提供一下Seat
类吗? - CheticamprelativeLayout.addView(objScrollView);
。这将您的滚动视图添加到relativeLayout
中,但我没有看到relativeLayout
的定义在哪里。这就是我要问的相对布局。它与objParentLayout
不同。 - Cheticamp