如何在运行时将视图添加到约束布局?

时间:2018-09-15 14:37:15

标签: android android-constraintlayout androidx

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

创建其他文本字段的方法

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>

2 个答案:

答案 0 :(得分:0)

这是我过去所做的。.

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

}

但是如果您有片段Java ,请更改为

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

以及如何删除

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

答案 1 :(得分:0)

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

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

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

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

如果使用Java代码制作按钮,则需要将其存储在某些变量中以附加方法。

您可以像这样将一种方法附加到您的按钮上。将此添加到您活动的onCreate方法中:

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

但是该代码可以用其他方式构造。在this link中,介绍了其他实现OnClickListener的方式。