[英]Create dynamic number of layouts with contents by code in Android
在我的活动中,我想在水平方向上创建动态数量的线性布局(在附加的示例中,我尝试在循环中创建 3 个水平布局,每个都包含一个文本和一个按钮,并且应该在里面一个一个地显示父垂直线性布局)
以下代码给出了屏幕截图中显示的结果。 循环中的最后一个布局重写所有其他布局
for(int kkk = 0; kkk < 4; kkk++) {
LinearLayout linearLayout = new LinearLayout(this);
linearLayout.setOrientation(LinearLayout.HORIZONTAL);
linearLayout.setGravity(Gravity.CENTER);
LinearLayout.LayoutParams textViewParams = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
TextView textView = new TextView(this);
textView.setLayoutParams(textViewParams);
textView.setText("Text number" + kkk);
textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 42);
linearLayout.addView(textView);
LinearLayout.LayoutParams buttonParams = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
Button button = new Button(this);
button.setLayoutParams(buttonParams);
button.setText("Button!" + kkk);
button.setTextSize(TypedValue.COMPLEX_UNIT_SP, 24);
linearLayout.addView(button);
setContentView(linearLayout);
}
我应该怎么做才能在循环中创建布局,如屏幕上带有红色标记的那样?
您可以使用单行 UI 创建一个新的 XML。 并在 onClick 或方法调用时膨胀此 xml。
LayoutInflater layoutInflater =
(LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
final View addView = layoutInflater.inflate(R.layout.row, null);
text1 = (EditText) addView.findViewById(R.id.text1);
text2 = (EditText) addView.findViewById(R.id.text2);
使用循环,您正在创建所有这些布局,但是由于每次循环都有效,您将设置为内容视图,因为循环的最后一个布局成为父布局和您的内容视图。 在循环外,创建一个父布局并设置为内容视图。 在循环内部,将其他布局添加到父布局。
LinearLayout parent = new LinearLayout(this);
parent.setOrientation(LinearLayout.VERTICAL);
for(int kkk = 0; kkk < 4; kkk++) {
LinearLayout linearLayout = new LinearLayout(this);
linearLayout.setOrientation(LinearLayout.HORIZONTAL);
linearLayout.setGravity(Gravity.CENTER);
LinearLayout.LayoutParams textViewParams = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
TextView textView = new TextView(this);
textView.setLayoutParams(textViewParams);
textView.setText("Text number" + kkk);
textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 42);
linearLayout.addView(textView);
LinearLayout.LayoutParams buttonParams = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
Button button = new Button(this);
button.setLayoutParams(buttonParams);
button.setText("Button!" + kkk);
button.setTextSize(TypedValue.COMPLEX_UNIT_SP, 24);
linearLayout.addView(button);
parent.addView(linearLayout);
}
setContentView(parent);
注意:循环将工作 4 次。 这意味着您将拥有 4 个相同的布局(以 0 开头,以 3 结尾)。 如果你想要 3 个布局,你应该改变范围。
for(int kkk = 0; kkk < 3; kkk++) {
}
或者
for(int kkk = 1; kkk < 4; kkk++){
}
编辑
如果我需要将 xml 中已经存在的布局设置为父级而不是创建,该怎么办?
设置您的 xml,创建一个布局实例(您希望将您的子视图添加到其中)并使用其 ID 查找,以便您可以将其与 Java 代码一起使用。
setContentView(R.layout.activity_main);
LinearLayout parent = findViewById(R.id.idOfLayout);
for(int kkk = 0; kkk < 4; kkk++) {
LinearLayout linearLayout = new LinearLayout(this);
linearLayout.setOrientation(LinearLayout.HORIZONTAL);
linearLayout.setGravity(Gravity.CENTER);
...
parent.addView(linearLayout);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.