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



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

用于创建其他文本字段的方法

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>

这是我过去所做的..!

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

2:为文本字段创建文本字段.XML文件

3:将此代码添加到您的活动 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);
}
}

假设您的按钮在 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();
}
});

但是这段代码可以用其他方式构建。在此链接中,解释了实现OnClickListener的其他方法。

最新更新