J'essaie de faire un ChipGroup & Chip basé sur un filtre de recyclage
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?
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
A LIRE AUSSI
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"
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
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>
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
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
}
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"/>