【问题标题】:How to add view to constraint layout at runtime?如何在运行时将视图添加到约束布局?
【发布时间】:2019-02-20 01:50:32
【问题描述】:

我想通过在按钮单击时添加文本字段来更新我的约束布局。到目前为止,我正在使用约束集,但我的布局没有更新。

创建附加文本字段的方法

private void createUtilForm(){
    titleInputLayout = new TextInputLayout(this);
    int titleId = ViewCompat.generateViewId();
    Log.d("AddEmployee", "createUtilForm: titleId"+ titleId);
    titleInputLayout.setId(titleId);
    ConstraintLayout.LayoutParams clpTitle = new ConstraintLayout.LayoutParams(
            ConstraintLayout.LayoutParams.MATCH_CONSTRAINT, ConstraintLayout.LayoutParams.WRAP_CONTENT);

    childConstraintLayout.addView(titleInputLayout, clpTitle);

    ConstraintSet utilFordSet = new ConstraintSet();

    utilFordSet.clone(childConstraintLayout);
    utilFordSet.connect(titleInputLayout.getId(), ConstraintSet.START, ConstraintSet.PARENT_ID, ConstraintSet.START);
    utilFordSet.connect(titleInputLayout.getId(), ConstraintSet.END, ConstraintSet.PARENT_ID, ConstraintSet.END);
    utilFordSet.connect(titleInputLayout.getId(), ConstraintSet.TOP, allowanceHeaderTV.getId(), ConstraintSet.BOTTOM);
    utilFordSet.connect(deductionHeaderTV.getId(), ConstraintSet.TOP, titleInputLayout.getId(), ConstraintSet.BOTTOM);

    utilFordSet.applyTo(childConstraintLayout);
}

XML 布局

    <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".AddEmployeeActivity">
    <ScrollView
        android:id="@+id/child_scrollview"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/add_employee_toolbar">

        <androidx.constraintlayout.widget.ConstraintLayout
            android:id="@+id/child_container"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">


            <TextView
                android:id="@+id/allowance_header_tv"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_marginStart="16dp"
                android:layout_marginTop="16dp"
                android:layout_marginEnd="8dp"
                android:text="@string/allowance_header_hint"
                android:textSize="24sp"
                app:layout_constraintEnd_toStartOf="@+id/allowance_add_ib"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toBottomOf="parent" />

            <ImageView
                android:id="@+id/allowance_add_ib"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginEnd="16dp"
                app:layout_constraintBottom_toBottomOf="@+id/allowance_header_tv"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintTop_toTopOf="@+id/allowance_header_tv"
                app:srcCompat="@drawable/ic_add" />

            <TextView
                android:id="@+id/deduction_header_tv"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_marginStart="16dp"
                android:layout_marginTop="16dp"
                android:layout_marginEnd="8dp"
                android:text="@string/deduction_header_hint"
                android:textSize="24sp"
                app:layout_constraintEnd_toStartOf="@+id/deduction_add_ib"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/allowance_header_tv" />

            <ImageView
                android:id="@+id/deduction_add_ib"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginEnd="16dp"
                android:contentDescription="@string/img_desc_label"
                app:layout_constraintBottom_toBottomOf="@+id/deduction_header_tv"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintTop_toTopOf="@+id/deduction_header_tv"
                app:srcCompat="@drawable/ic_add" />

        </androidx.constraintlayout.widget.ConstraintLayout>
    </ScrollView>

</androidx.constraintlayout.widget.ConstraintLayout>

【问题讨论】:

  • 很明显你试图让good question尽你所能。我在这里看到的唯一问题是你的英语有点难以理解。我会尽量猜测你想说的最好的我能说的。也许你正试图将你的方法绑定到一个按钮,所以当你点击它时,方法就会执行?
  • 您提供的 XML 示例中似乎不存在您的 &lt;Button&gt;...所以,如果您不介意,我的回答将基于假设的 &lt;button&gt; 小部件。 .
  • 但是,您的问题似乎与Android: how to handle button click 重复。
  • 嗨,@SebasSBM,我刚刚意识到,我应该正确地构建问题。我想以编程方式创建视图(使用约束布局),以便我可以设置它们的 ID。

标签: android android-constraintlayout androidx


【解决方案1】:

这是我过去所做的......!

1:只需在 Acitivity.XML 文件的约束布局内创建一个空线性布局,并定义约束(如果有)。

2:为您的文本字段创建一个 textfield.XML 文件

3:将此代码添加到您的Activity java.

 public void addLayout() {


    LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);

    final View row = inflater.inflate(R.layout.textfield, null);

    linearLayout.addView(row, linearLayout.getChildCount() - 1);

}

但是如果你有一个fragment java改成这个

 LayoutInflater inflater = (LayoutInflater)getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);

以及如何删除

  public void RemoveLayout() {
        if (linearLayout.getChildCount() > 0) {
            linearLayout.removeViewAt(linearLayout.getChildCount() - 1);
        }
    }

【讨论】:

    【解决方案2】:

    假设你的按钮在你的 XML 布局中是这样的:

    <Button
        android:id="@+id/addTextViewButton"
        [...] />
    

    您可以像这样获得对按钮的引用:

    Button myButton = findViewById(R.id.addTextViewButton);
    

    如果你用java代码制作按钮,你需要将它存储在一些变量中来附加方法。

    您可以像这样将方法附加到您的按钮。将此添加到您的 Activity 的 onCreate 方法中:

    myButton.setOnClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            createUtilForm();
        }
    });
    

    但此代码可以以其他方式构造。在this link 中解释了实现OnClickListeners 的其他方式。

    【讨论】:

      猜你喜欢
      • 2019-05-04
      • 1970-01-01
      • 2021-03-05
      • 1970-01-01
      • 2017-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多