【问题标题】:Create dynamic number of layouts with contents by code in Android在 Android 中通过代码创建具有内容的动态布局数量
【发布时间】:2021-04-21 04:41:35
【问题描述】:

在我的活动中,我想在水平方向上创建动态数量的线性布局(在附加的示例中,我尝试在循环中创建 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);
    }

the result of code

我应该怎么做才能在循环中创建布局,如屏幕上带有红色标记的那样?

【问题讨论】:

    标签: java android layout


    【解决方案1】:

    您可以使用单行 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);
    

    【讨论】:

      【解决方案2】:

      使用循环,您将创建所有这些布局,但由于每次循环都有效,您将设置为内容视图,因为循环的最后一个布局成为父布局和您的内容视图。 在循环外,创建一个父布局并设置为内容视图。在循环内部,将其他布局添加到父布局。

      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);
      }
      

      【讨论】:

      • 谢谢!它完美无缺。如果我需要将 xml 中已经存在的布局设置为父级而不是创建呢?
      • 编辑了我的答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-21
      • 1970-01-01
      • 1970-01-01
      • 2012-01-11
      • 1970-01-01
      相关资源
      最近更新 更多