繁体   English   中英

通过 Android 中的代码创建具有内容的动态布局数量

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM