Android Material Chip - ChipGroup с singleSelection не работает, динамически добавляя чипы

Я впервые использую Material Chip.

Проблема: я динамически добавляю чип, используя следующий код. Пожалуйста, проверьте, я написал app:singleSelection="true", что важно для меня. Несмотря на выбор нескольких фишек одновременно.

Я хочу выбрать только одну фишку с галочкой за раз.

XML-код:

<com.google.android.material.chip.ChipGroup
                android:id="@+id/categoryChipsView"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:gravity="center_vertical"
                android:orientation="horizontal"
                app:chipSpacing="10dp"
                app:singleSelection="true"
                app:itemSpacing="15dp"
                app:singleLine="true">
</com.google.android.material.chip.ChipGroup>

Код Java:

private void addChipView(String chipText) {
    View child = getLayoutInflater().inflate(R.layout.row_chip_view, null);
    Chip chip = child.findViewById(R.id.chip);
    chip.setText(chipText);
    chip.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(mContext, ((Chip) v).getText(), Toast.LENGTH_SHORT).show();
        }
    });
    // This is ChipGroup view
    binding.categoryChipsView.addView(child);
}

row_chip_view.xml

<com.google.android.material.chip.Chip xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/chip"
    style="@style/Widget.MaterialComponents.Chip.Filter"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_margin="10dp"
    android:text="@string/app_name"
    android:textColor="@android:color/white"
    app:checkedIcon="@drawable/ic_check"
    app:chipBackgroundColor="@color/colorAccent"
    app:chipEndPadding="8dp"
    app:chipIconTint="@android:color/white"
    app:chipStartPadding="8dp"
    app:textEndPadding="5dp"
    app:textStartPadding="5dp" />

введите здесь описание изображения

То, что я пробовал статически, я вставил вид row_chip_view.xml как дочерний элемент ChipGroup в основной xml, и он работает нормально. Я могу выбрать только один чип за раз.

           <com.google.android.material.chip.ChipGroup
                android:id="@+id/categoryChipsView"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:gravity="center_vertical"
                android:orientation="horizontal"
                app:chipSpacing="10dp"
                app:singleSelection="true"
                app:itemSpacing="15dp"
                app:singleLine="true">

                <com.google.android.material.chip.Chip 
                    android:id="@+id/chip"
                    style="@style/Widget.MaterialComponents.Chip.Filter"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_margin="10dp"
                    android:text="@string/app_name"
                    android:textColor="@android:color/white"
                    app:checkedIcon="@drawable/ic_check"
                    app:chipBackgroundColor="@color/colorAccent"
                    app:chipEndPadding="8dp"
                    app:chipIconTint="@android:color/white"
                    app:chipStartPadding="8dp"
                    app:textEndPadding="5dp"
                    app:textStartPadding="5dp" />

                <com.google.android.material.chip.Chip 
                    android:id="@+id/chip2"
                    style="@style/Widget.MaterialComponents.Chip.Filter"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_margin="10dp"
                    android:text="@string/app_name"
                    android:textColor="@android:color/white"
                    app:checkedIcon="@drawable/ic_check"
                    app:chipBackgroundColor="@color/colorAccent"
                    app:chipEndPadding="8dp"
                    app:chipIconTint="@android:color/white"
                    app:chipStartPadding="8dp"
                    app:textEndPadding="5dp"
                    app:textStartPadding="5dp" />

                <com.google.android.material.chip.Chip 
                    android:id="@+id/chip3"
                    style="@style/Widget.MaterialComponents.Chip.Filter"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_margin="10dp"
                    android:text="@string/app_name"
                    android:textColor="@android:color/white"
                    app:checkedIcon="@drawable/ic_check"
                    app:chipBackgroundColor="@color/colorAccent"
                    app:chipEndPadding="8dp"
                    app:chipIconTint="@android:color/white"
                    app:chipStartPadding="8dp"
                    app:textEndPadding="5dp"
                    app:textStartPadding="5dp" />

            </com.google.android.material.chip.ChipGroup>

введите здесь описание изображения

НО Я ХОЧУ ЭТОГО ДИНАМИЧЕСКИ.

Обновление: новый сценарий

В первую очередь я добавил четыре чипа в XML внутри ChipGroup, а после этого попробовал ПРОГРАММНО добавить еще три чипа в тот же ChipGroup. Первые четыре чипа позволяют выбрать только один, а последние три чипа позволяют выбрать несколько. Очень странно.

Дайте мне знать, если я что-то пропустил.

Ваша помощь будет оценена по достоинству.


person Pratik Butani    schedule 07.11.2019    source источник
comment
Проверьте это, это может вам помочь: stackoverflow.com/a/53518090/7666442   -  person AskNilesh    schedule 07.11.2019
comment
@NileshRathod Кажется, это немного отличается, так как я хочу каждый раз выбирать только один чип.   -  person Pratik Butani    schedule 07.11.2019
comment
Тогда вам нужно использовать app:singleSelection="true" или setSingleSelection() в вашем ChipGroup   -  person AskNilesh    schedule 07.11.2019
comment
Пытался. Не работает. Можно попробовать добавить просто 3-4 чипа в ChipGroup программно и проверить. @NileshRathod   -  person Pratik Butani    schedule 07.11.2019
comment
Вы уверены в этой строке binding.categoryChipsView.addView(child);? вы должны добавить чип в группу чипов, вместо этого вы добавляете вид (ребенок, а не чип)   -  person Gabriele Mariotti    schedule 07.11.2019
comment
@GabrieleMariotti Да, другого метода, подобного addChip, нет.   -  person Pratik Butani    schedule 07.11.2019
comment
Попробуйте использовать: Chip chip = (Chip) getLayoutInflater().inflate(R.layout.row_chip_view, chipGroup, false); //.... chipGpRow.addView(chip).   -  person Gabriele Mariotti    schedule 07.11.2019
comment
@PratikButani Я могу воспроизвести проблему. Просто удалите id в расположении фишек. Проверьте мой ответ ниже.   -  person Gabriele Mariotti    schedule 07.11.2019


Ответы (3)


Удалите в row_chip_view.xml атрибут android:id.

<com.google.android.material.chip.Chip 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    style="@style/Widget.MaterialComponents.Chip.Filter"
    .../>

И в addChipView используйте:

private void addChipView(String chipText) {
    Chip chip = (Chip) getLayoutInflater().inflate(R.layout.row_chip_view, chipGroup, false);
    chip.setText(chipText);
    //...

    // This is ChipGroup view
    chipGroup.addView(chip);
}
person Gabriele Mariotti    schedule 07.11.2019
comment
Большое спасибо. Его глупая неизвестная ошибка и не в состоянии выяснить. - person Pratik Butani; 08.11.2019
comment
Я попробовал этот ответ, но он сработал только после того, как я динамически добавил идентификатор для чипа следующим образом: chip.id = ViewCompat.generateViewId() - person akhris; 27.01.2020

Вместо onClickListener используйте setOnCheckedChangeListener, у меня работает в сочетании с singleSelection="true"

person Traendy    schedule 07.11.2019

Добавьте целочисленный идентификатор перед добавлением чипа в ChipGroupd

    Chip chip = (Chip) getLayoutInflater().inflate(R.layout.custom_chip, chipGroup,
  false);
            chip.setId(i);
            chip.setText("str");
            chipGroup.addView(chip);
person KoOPa    schedule 26.04.2020