Удаление просмотров динамически - PullRequest
0 голосов
/ 05 апреля 2019

Я много чего ищу, но не могу решить. У меня есть LinearLayout с двумя текстовыми представлениями и кнопкой (чтобы добавить другие LinearLayout), как это:

         <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="match_parent">

             <EditText android:id="@+id/ingredientsField"
                    android:layout_width="wrap_content"
                    android:layout_height="match_parent"
                    android:layout_margin="@dimen/boxes_margin"
                    android:hint="@string/ingredients"
                    android:inputType="text"
                    xmlns:android="http://schemas.android.com/apk/res/android" />

             <EditText
                    android:id="@+id/quantityField"
                    android:layout_width="wrap_content"
                    android:layout_height="match_parent"
                    android:layout_margin="@dimen/boxes_margin"
                    android:hint="@string/quantity"
                    android:inputType="number"
                    />

             <com.google.android.material.button.MaterialButton
                    android:id="@+id/add_ingredient_btn"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="@string/add"
                    android:layout_margin="@dimen/boxes_margin"
                    app:icon="@drawable/ic_add_ingr_btn"
                    />

         </LinearLayout>

Добавлен макет:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="match_parent"
android:layout_height="50dp">

    <EditText android:id="@+id/ingredientsField"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_margin="@dimen/boxes_margin"
        android:hint="@string/ingredients"
        android:inputType="text"
        xmlns:android="http://schemas.android.com/apk/res/android" />

    <EditText android:id="@+id/quantityField"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_margin="@dimen/boxes_margin"
        android:hint="@string/quantity"
        android:inputType="number"
        xmlns:android="http://schemas.android.com/apk/res/android" />

    <ImageButton
        android:id="@+id/remove_ingredient_btn"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_margin="@dimen/boxes_margin"
        android:src="@drawable/ic_remove_ing_qnt"/>

</LinearLayout>

В упражнении я создал метод для добавления новых макетов (и он работает), а внутри него - метод для удаления соответствующего макета с помощью кнопки Delete . Кнопка «Удалить» работает только один раз и только если она добавлена ​​в первый макет. Вот код:

    add_ingredient.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            final View rowView = inflater.inflate(R.layout.ingredient_quantity_layout, null);
            // Add the new row before the add field button.
            parentIngredientLayout.addView(rowView);

            ImageButton removeChildIngredient = findViewById(R.id.remove_ingredient_btn);

            removeChildIngredient.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                   parentIngredientLayout.removeView((View) v.getParent());
                }
            });
        }
    });

Ответы [ 2 ]

1 голос
/ 05 апреля 2019

Вы должны установить событие OnClickListener на ImageButton из последнего вставленного макета. Для этого просто измените эту строку

ImageButton removeChildIngredient = findViewById(R.id.remove_ingredient_btn);

до

ImageButton removeChildIngredient = rowView.findViewById(R.id.remove_ingredient_btn);

rowView.findViewById поиск в ImageButton по последнему вставленному макету, а не по всему макету, который содержит другие макеты.

1 голос
/ 05 апреля 2019

В этой строке:

parentIngredientLayout.removeView((View) 
  v.getParent());

Вы пытаетесь удалить родителя removeChildIngredient ImageButton, который, вероятно, является parentIngredientLayout, что, я думаю, не то, что вы хотите,

Вы могли быпопробуйте это:

parentIngredientLayout.
removeView(rowView);

Но в вашей реализации вы можете столкнуться с проблемами, когда добавите несколько ингредиентов, поскольку вы устанавливаете новый onClickListener для каждого нового ингредиента, а ImageButton удаляет только последний из вас.добавили (последний набор onClickListener),

Вместо этого вы можете использовать List / RecyclerView или искать другую реализацию, например.поместите ImageButton внутри раздуваемого макета, чтобы в каждом добавляемом макете была одна кнопка «Удалить»,

Затем вы должны заменить findViewById вашего ImageButton на rowView.findViewById

И эта строка должнаостаться без изменений

parentIngredientLayout.removeView((View) v.getParent());
...