web-dev-qa-db-fra.com

Groupe de puces OnCheckedChangeListener () non déclenché

J'essaie de faire un ChipGroup & Chip basé sur un filtre de recyclage

enter image description here

J'utilise un fragment sur mon application, donc le fragment qui contient RecyclerView contient un frameLayout qui gonfle le fragment de filtre ChipGroup

J'essaie de déclencher un écouteur lorsque l'utilisateur désélectionne toutes les puces dans ChipGroup (j'ai déjà mis l'écouteur sur la puce pour le déclenchement lorsque la puce est vérifiée par l'utilisateur)

J'ai déjà mis un auditeur sur chipgroup mais personne n'est inquiété

FilterFragment.Java

public class FilterFragment extends Fragment {
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
public ChipGroup chipGroup;

// TODO: Rename and change types of parameters
public View.OnClickListener chipClickListener;

private OnFragmentInteractionListener mListener;

public FilterFragment() {
    // Required empty public constructor
}


public static FilterFragment newInstance(View.OnClickListener 
param1) {
    CoachFilterFragment fragment = new CoachFilterFragment();
    Bundle args = new Bundle();

    fragment.setArguments(args);
    return fragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments() != null) {

    }
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup 
container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_filter, 
container, false);
    this.chipGroup = view.findViewById(R.id.chipGroup);
    for(Skill skill : ((MainActivity)getContext()).api.skills){

        Chip chip = new Chip(getContext());
        chip.setId(skill.getId());


        chip.setText(skill.getName());
        chip.setOnClickListener(chipClickListener);
        chip.setCheckable(true);
        chipGroup.addView(chip);

    }

    chipGroup.setOnCheckedChangeListener((chipGroup, id) -> {
      Log.d("test","ok");
    });


    return view;
}

public void onButtonPressed(Uri uri) {
    if (mListener != null) {
        mListener.onFragmentInteraction(uri);
    }
}

@Override
public void onAttach(Context context) {
    super.onAttach(context);

}

@Override
public void onDetach() {
    super.onDetach();
    mListener = null;
}



public interface OnFragmentInteractionListener {
    // TODO: Update argument type and name
    void onFragmentInteraction(Uri uri);
  }
}

FilterFragment.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 
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:layout_width="match_parent"
Android:layout_height="wrap_content"
tools:context=".Fragment.FilterFragment">

<androidx.constraintlayout.widget.ConstraintLayout
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content">

    <com.google.Android.material.chip.ChipGroup
        Android:id="@+id/chipGroup"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_marginStart="8dp"
        Android:layout_marginLeft="8dp"
        Android:layout_marginTop="8dp"
        Android:layout_marginEnd="8dp"
        Android:layout_marginRight="8dp"
        Android:layout_marginBottom="8dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

       </com.google.Android.material.chip.ChipGroup>
   </androidx.constraintlayout.widget.ConstraintLayout>

</FrameLayout>

Quelqu'un a une idée pourquoi aucun auditeur n'est déclenché par mon ChipGroup? Peut-être qu'il me manque un paramètre ou quelque chose?

10
Benjamin

Votre code est très bien le seul problème est que setOnCheckedChangeListener() ne fonctionne que lorsque votre ChipGroup est pour singleSelection

Lisez cette documentation de ChipGroup

setOnCheckedChangeListener()

  • Enregistrez un rappel à appeler lorsque la puce vérifiée change dans ce groupe.
  • Ce rappel n'est invoqué qu'en mode de sélection unique.

A LIRE AUSSI

Gestion des jetons vérifiés

Appelez setOnCheckedChangeListener (OnCheckedChangeListener) pour enregistrer un rappel à appeler lorsque la puce vérifiée change dans ce groupe. Ce rappel n'est invoqué qu'en mode de sélection unique.

si vous voulez utiliser setOnCheckedChangeListener() de ChipGroup que vous devez faire app:singleSelection="true"

[~ # ~] mise à jour [~ # ~]

sur la base de votre commentaire ci-dessous, j'ai ajouté un exemple de code à gérer pour gérer la sélection de ChipGroup

EXEMPLE DE CODE pour maintenir la sélection dans ChipGroup

Layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:orientation="vertical"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content">

    <androidx.constraintlayout.widget.ConstraintLayout
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content">

        <com.google.Android.material.chip.ChipGroup
            Android:id="@+id/chipGroup"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:layout_marginStart="8dp"
            Android:layout_marginLeft="8dp"
            Android:layout_marginTop="8dp"
            Android:layout_marginEnd="8dp"
            Android:layout_marginRight="8dp"
            Android:layout_marginBottom="8dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            >

        </com.google.Android.material.chip.ChipGroup>
    </androidx.constraintlayout.widget.ConstraintLayout>

    <Button
        Android:layout_width="match_parent"
        Android:text="Get Result"
        Android:id="@+id/btnShowResult"
        Android:layout_gravity="bottom"
        Android:layout_height="wrap_content" />
</LinearLayout>

Code d'activité

public class Main3Activity extends AppCompatActivity {

    public ChipGroup chipGroup;
    public Button btnShowResult;
    public ArrayList<Boolean> booleanArrayList = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main3);

        chipGroup = findViewById(R.id.chipGroup);
        btnShowResult = findViewById(R.id.btnShowResult);


        btnShowResult.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                for (int i = 0; i < booleanArrayList.size(); i++) {
                    Log.e("RESULT", i + " :" + booleanArrayList.get(i));
                }
            }
        });

        for (int i = 0; i < 5; i++) {

            Chip chip = new Chip(this);
            chip.setId(i);
            chip.setTag(i);

            booleanArrayList.add(false);
            chip.setText("Chip No : " + i);
            chip.setCheckable(true);

            chip.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton compoundButton, boolean b) {

                    int tag = (int) compoundButton.getTag();
                    booleanArrayList.set(tag, b);

                }
            });
            chipGroup.addView(chip);

        }

        chipGroup.invalidate();


        chipGroup.setOnCheckedChangeListener(new ChipGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(ChipGroup chipGroup, int i) {

                Chip chip = chipGroup.findViewById(i);


                if (chip != null)
                    Toast.makeText(getApplicationContext(), "Chip is " + chip.getText().toString(), Toast.LENGTH_SHORT).show();

                Log.e("OnCheckedChangeListener", "Called");
            }
        });

    }

    ChipGroup.OnCheckedChangeListener onCheckedChangeListener = new ChipGroup.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(ChipGroup chipGroup, int i) {

        }
    };

}

Pour plus d'informations, veuillez consulter les articles ci-dessous

17
Nilesh Rathod

L'écouteur Chip Click ne fonctionnera que si la sélection unique a été définie sur true dans chipGroup.

app:singleSelection="true"

Si vous utilisez le style comme ci-dessous, assurez-vous qu'il a également été donné à chaque puce individuelle.

style="@style/Widget.MaterialComponents.Chip.Choice"

comme ça:

<com.google.Android.material.chip.ChipGroup
                Android:id="@+id/chip_group"
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:layout_marginStart="10dp"
                Android:layout_marginEnd="10dp"
                app:singleSelection="true"
                style="@style/Widget.MaterialComponents.Chip.Choice">

            <com.google.Android.material.chip.Chip
                    Android:id="@+id/chip_2"
                    Android:layout_width="wrap_content"
                    Android:layout_height="wrap_content"
                    style="@style/Widget.MaterialComponents.Chip.Choice"
                    Android:text="@string/announcements"
                    Android:textAppearance="@style/ChipThemeBold"/>
            <com.google.Android.material.chip.Chip
                    Android:id="@+id/chip_3"
                    Android:layout_width="wrap_content"
                    Android:layout_height="wrap_content"
                    style="@style/Widget.MaterialComponents.Chip.Choice"
                    Android:text="@string/fyi"
                    Android:textAppearance="@style/ChipThemeBold"/>
            <com.google.Android.material.chip.Chip
                    Android:id="@+id/chip_4"
                    Android:layout_width="wrap_content"
                    Android:layout_height="wrap_content"
                    style="@style/Widget.MaterialComponents.Chip.Choice"
                    Android:text="@string/heartbeat"
                    Android:textAppearance="@style/ChipThemeBold"  />
            <com.google.Android.material.chip.Chip
                    Android:id="@+id/chip_5"
                    Android:layout_width="wrap_content"
                    Android:layout_height="wrap_content"
                    style="@style/Widget.MaterialComponents.Chip.Choice"
                    Android:text="@string/pitch"
                    Android:textAppearance="@style/ChipThemeBold"  />
            <com.google.Android.material.chip.Chip
                    Android:id="@+id/chip_6"
                    Android:layout_width="wrap_content"
                    Android:layout_height="wrap_content"
                    style="@style/Widget.MaterialComponents.Chip.Choice"
                    Android:text="@string/question"
                    Android:textAppearance="@style/ChipThemeBold" 
                    Android:layout_marginEnd="15dp" />

        </com.google.Android.material.chip.ChipGroup>
1

j'ai le même problème, mais ce n'est pas lié à ChipGroup parce que j'ai mis le ChipGroup au mauvais endroit comme ceci:

<androidx.constraintlayout.widget.ConstraintLayout>

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

   <other full screen view />
<androidx.constraintlayout.widget.ConstraintLayout/>

cela rend mon ChipGroup flou, il suffit donc de déplacer le ChipGroup en bas de la vue parent

<androidx.constraintlayout.widget.ConstraintLayout>
   <other full screen view />

   <-- change here -->
   <com.google.Android.material.chip.ChipGroup />
<androidx.constraintlayout.widget.ConstraintLayout/>

et ça marche, j'espère que ça aide

0
vuhung3990

Cela fonctionne comme ça.

// com.google.Android.material.chip.ChipGroup
app:singleSelection="true"

// com.google.Android.material.chip.Chip (R.layout.chip)
style="@style/Widget.MaterialComponents.Chip.Choice"

// Inflate instead of NEW instance
val chip = layoutInflater.inflate(R.layout.chip, chipGroup, false) as Chip
chip.text = "Text"
chipGroup.addView(chip)

// setOnCheckedChangeListener
chipGroup.setOnCheckedChangeListener { group, checkedId ->
    // The same checked chip
    if (checkedId == -1) {
        return@setOnCheckedChangeListener
    }

    // TODO
}
0
Samnang CHEA

Je suggérerai de ne pas utiliser recyclerview avec des puces si vous voulez un défilement horizontal parce que vous avez HorizontalScrollView et cela fonctionne assez bien avec chipgroup:

Basé sur la réponse de Nilesh Rathod. Pour ajouter des puces dynamiquement, vous avez besoin du code suivant:

Code du fichier d'activité:

String[] fileNameChip = getIntent().getStringArrayExtra(Constants.CHIPS_NAME_ARRAY);

        for (final String chipName : fileNameChip) {
             LayoutInflater layoutInflater = getLayoutInflater();
             Chip chip = (Chip) 
             layoutInflater.inflate(R.layout.cat_chip_group_item_choice, chipGroup, false);
             chip.setText(chipName);
             chip.setId(i); //HERE SET ID THAT WILL BE CHECKED_ID ON setOnCheckedChangeListener

             chip.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View v) {
                     Log.d(TAG, "onClick: " + chipName );
                     }
                  });
                  chipGroup.addView(chip);
              }  
              chipGroup.setOnCheckedChangeListener(new ChipGroup.OnCheckedChangeListener() {
                   @Override
                   public void onCheckedChanged(ChipGroup group, int checkedId) {
                          Log.d(TAG, "onCheckedChanged: " + checkedId);
                       }
                    });

FICHIER XML d'activité:

<LinearLayout 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:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="vertical">

<HorizontalScrollView
    Android:layout_width="match_parent"
    Android:scrollbars="none"
    Android:layout_height="wrap_content">

    <com.google.Android.material.chip.ChipGroup
        Android:id="@+id/chip_group_code_files"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        app:singleLine="true"
        app:singleSelection="true" />
</HorizontalScrollView>

cat_chip_group_item_choice.xml :( Spécifiez le type de puce: choix, filtre, action, normal)

<?xml version="1.0" encoding="utf-8"?>
<com.google.Android.material.chip.Chip
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    style="@style/Widget.MaterialComponents.Chip.Choice"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"/>
0
Sumit Shukla