Как добавить представление к макету ограничения во время выполнения? - PullRequest
0 голосов
/ 15 сентября 2018

Я хочу обновить свой макет ограничения, добавив текстовые поля по нажатию кнопки.пока я использую набор ограничений, но мой макет не обновляется.

Methond для создания дополнительного текстового поля

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 Layout

    <?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 голосов
/ 15 сентября 2018

Предположим, ваша кнопка выглядит так в вашем 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 s.

0 голосов
/ 15 сентября 2018

Вот что я делал в прошлом ..!

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