Как мне сделать ChipGroup действовать как радиогруппа? - PullRequest
1 голос
/ 05 октября 2019

Как мне заставить ChipGroup вести себя как radioButton, когда один элемент может быть выбран за один раз при изменении цвета фона.

Image Screenshot

Я видел эту ссылку для чего-то подобного, но это мне не помогло, потому что я использую layoutInflater, чтобы показать свой элемент фишки.

firebaseFirestore.collection("Categories").addSnapshotListener((queryDocumentSnapshots, e) -> {
            for (DocumentChange doc: queryDocumentSnapshots.getDocumentChanges()){
                if (doc.getType() == DocumentChange.Type.ADDED){
                    Categories categories = doc.getDocument().toObject(Categories.class);
                    post_list.add(categories);
                    Chip chip = (Chip) getLayoutInflater().inflate(R.layout.chip_item_layout, chipGroup, false);
                    chip.setText(categories.getTitle());
                    chipGroup.addView(chip);
                    chipGroup.setOnCheckedChangeListener((chipGroup, id) -> {
                        Chip chip2 = ((Chip) chipGroup.getChildAt(chipGroup.getCheckedChipId()));
                        if (chip2 != null) {
                            for (int i = 0; i < chipGroup.getChildCount(); ++i) {
                                chipGroup.getChildAt(i).setClickable(true);
                                chip2.setChipBackgroundColorResource(R.color.customOrange);
                            }
                            chip2.setClickable(false);
                        }
                    });

                }
            }
        });

1 Ответ

1 голос
/ 05 октября 2019

В вашем ChipGroup используйте атрибут app:singleSelection="true". Таким образом, ChipGroup можно настроить так, чтобы можно было проверять только один чип одновременно.

<com.google.android.material.chip.ChipGroup
    app:singleSelection="true"
    ..>

Затем вы можете установить цвет селектора, используя app:chipBackgroundColorатрибут в вашем макете chip_item_layout.xml.

Что-то вроде:

<com.google.android.material.chip.Chip
    style="@style/Widget.MaterialComponents.Chip.Choice"
    app:chipBackgroundColor="@color/chip_background_color"
    ..>

Обратите внимание на style="@style/Widget.MaterialComponents.Chip.Choice", поскольку он определяет чип как android:checkable="true".

chip_background_color это селектор, в котором вы можете определить свои любимые цвета в разных состояниях. Это селектор по умолчанию, вы можете изменить его:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
  <!-- 24% opacity -->
  <item android:alpha="0.24" android:color="?attr/colorPrimary" android:state_enabled="true" android:state_selected="true"/>
  <item android:alpha="0.24" android:color="?attr/colorPrimary" android:state_enabled="true" android:state_checked="true"/>
  <!-- 12% of 87% opacity -->
  <item android:alpha="0.10" android:color="?attr/colorOnSurface" android:state_enabled="true"/>
  <item android:alpha="0.12" android:color="?attr/colorOnSurface"/>

</selector>

Выбранный чип определяется по цвету, в вашем случае это первая строка (android:state_selected="true").

Если вы хотитенравится делать это программно, просто используйте ( не в OnCheckedChangeListener) метод setChipBackgroundColorResource.

chip.setChipBackgroundColorResource(R.color.chip_background_color);

enter image description here

...