【问题标题】:Set specific number of chips that can be selected in a chip group设置芯片组中可以选择的具体芯片数量
【发布时间】:2020-05-10 15:44:08
【问题描述】:

用例:我正在制作一个类别选择器,用户必须从具有多个芯片的芯片组中选择 5 个芯片。用户不能选择超过 5 个筹码。

我的筹码组码:

<com.google.android.material.chip.ChipGroup
        android:id="@+id/category_chip_group"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="16dp"
        >
        <com.google.android.material.chip.Chip
            android:id="@+id/tech_chip"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:checkable="true"
            android:clickable="true"
            android:focusable="true"
            app:chipBackgroundColor="@drawable/bg_chip_list"
            android:text="Technology"/>
        <com.google.android.material.chip.Chip
            android:id="@+id/sports_chip"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Sports and Fitness"
            android:checkable="true"
            android:clickable="true"
            android:focusable="true"
            app:chipBackgroundColor="@drawable/bg_chip_list"/>

        <com.google.android.material.chip.Chip
            android:id="@+id/public_speakin_chip"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:checkable="true"
            android:clickable="true"
            android:focusable="true"
            app:chipBackgroundColor="@drawable/bg_chip_list"

            android:text="Public Speaking"/>
        <com.google.android.material.chip.Chip
            android:id="@+id/biz_chip"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:checkable="true"
            android:clickable="true"
            android:focusable="true"

            app:chipBackgroundColor="@drawable/bg_chip_list"
            android:text="Business and careers"/>
        <com.google.android.material.chip.Chip
            android:id="@+id/read_chip"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:checkable="true"
            android:clickable="true"
            android:focusable="true"
            app:chipBackgroundColor="@drawable/bg_chip_list"
            android:text="Reading and Writing"/>
        <com.google.android.material.chip.Chip
            android:id="@+id/yoga_med_chip"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:checkable="true"
            android:clickable="true"
            android:focusable="true"
            app:chipBackgroundColor="@drawable/bg_chip_list"
            android:text="Yoga and meditation"/>
        <com.google.android.material.chip.Chip
            android:id="@+id/sing_chip"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:checkable="true"
            android:clickable="true"
            android:focusable="true"
            app:chipBackgroundColor="@drawable/bg_chip_list"
            android:text="Singing"/>
        <com.google.android.material.chip.Chip
            android:id="@+id/dance_chip"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:checkable="true"
            android:clickable="true"
            android:focusable="true"
            app:chipBackgroundColor="@drawable/bg_chip_list"
            android:text="Dancing"/>
        <com.google.android.material.chip.Chip
            android:id="@+id/food_chip"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:checkable="true"
            android:clickable="true"
            android:focusable="true"
            app:chipBackgroundColor="@drawable/bg_chip_list"

            android:text="Food Blogging"/>
        <com.google.android.material.chip.Chip
            android:id="@+id/gaming_chip"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:checkable="true"
            android:clickable="true"
            android:focusable="true"
            app:chipBackgroundColor="@drawable/bg_chip_list"
            android:text="Gaming"/>
        <com.google.android.material.chip.Chip
            android:id="@+id/beauty_chip"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:checkable="true"
            android:clickable="true"
            android:focusable="true"
            app:chipBackgroundColor="@drawable/bg_chip_list"

            android:text="Beauty and Makeup"/>
        <com.google.android.material.chip.Chip
            android:id="@+id/fashion_chip"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:checkable="true"
            android:clickable="true"
            android:focusable="true"
            app:chipBackgroundColor="@drawable/bg_chip_list"
            android:text="Fashion and Lifestyle"/>
        <com.google.android.material.chip.Chip
            android:id="@+id/photography_chip"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:checkable="true"
            android:clickable="true"
            android:focusable="true"
            app:chipBackgroundColor="@drawable/bg_chip_list"

            android:text="Photography"/>
        <com.google.android.material.chip.Chip
            android:id="@+id/music_chip"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:checkable="true"
            android:clickable="true"
            android:focusable="true"
            app:chipBackgroundColor="@drawable/bg_chip_list"

            android:text="Music"/>
        <com.google.android.material.chip.Chip
            android:id="@+id/movies_chip"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:checkable="true"
            android:clickable="true"
            android:focusable="true"
            app:chipBackgroundColor="@drawable/bg_chip_list"

            android:text="Movies and TV shows"/>
        <com.google.android.material.chip.Chip
            android:id="@+id/travel_chip"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:checkable="true"
            android:clickable="true"
            android:focusable="true"
            app:chipBackgroundColor="@drawable/bg_chip_list"

            android:text="Travel"/>
        <com.google.android.material.chip.Chip
            android:id="@+id/art_and_design_chip"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:checkable="true"
            android:clickable="true"
            android:focusable="true"
            app:chipBackgroundColor="@drawable/bg_chip_list"

            android:text="Art and design"/>


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

我的芯片选择java代码

Chip chip = (Chip) category_chips.getChildAt(i);
if (chip.isChecked()) {
    Log.e("i", "" + i);
    i = i + 1;
    categories.add(chip.getText().toString());
    if (i > 5) {
        chip.setChecked(false);
        chip.setSelected(false);
    }
}

我想将所选芯片中的字符串添加到数组列表中 这段代码是我所做的尝试之一。我是初学者,我不知道如何实现此功能

请帮助我了解如何在 java 中实现这个用例。我在 stackoverflow 上尝试了很多答案,但没有找到一个满足我用例的答案。

【问题讨论】:

    标签: java android material-components-android material-components android-chips


    【解决方案1】:

    您可以在您的筹码中添加OnCheckedChangeListener,并在ChipGroup 中查看选中的筹码数量。 比如:

      ChipGroup chipGroup = findViewById(R.id.category_chip_group);
      ..
      chip.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override public void onCheckedChanged(CompoundButton compoundButton, boolean checked) {
          if (checked) {
            //Get all checked chips in the group
            List<Integer> ids = chipGroup.getCheckedChipIds();
            if (ids.size() > 5) { 
              chip.setChecked(false);  //force to unchecked the chip
            }
          }
        }
      });
    

    【讨论】:

      【解决方案2】:

      像这样改变芯片样式:

      <com.google.android.material.chip.Chip
          ...
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          style="@style/Widget.MaterialComponents.Chip.Filter"
          ...
       />
      

      将选中的监听器添加到所有芯片:

      tech_chip.setOnCheckedChangeListener(this);
      ....
      art_and_design_chip.setOnCheckedChangeListener(this);
      

      onCheckedChanged 方法:

      @Override
      public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
          Chip chip = findViewById(compoundButton.getId());
          String chipText = chip.getText().toString();
      
          if(categories.size()< 5){
              categories.add(chipText);
          }else {
              if(categories.contains(chipText)){
                  categories.remove(chipText);
              }else{
                  chip.setChecked(false);
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2019-05-23
        • 2019-12-19
        • 2019-09-11
        • 1970-01-01
        • 2020-08-25
        • 1970-01-01
        • 1970-01-01
        • 2020-09-02
        • 1970-01-01
        相关资源
        最近更新 更多