Solución:
Tu código está bien, el único problema es que setOnCheckedChangeListener()
solo funciona cuando tu ChipGroup
es para singleSelection
Lea esta documentación de ChipGroup
setOnCheckedChangeListener()
- Registre una devolución de llamada para que se invoque cuando el chip marcado cambie en este grupo.
- Esta devolución de llamada solo se invoca en el modo de selección única.
LEER TAMBIÉN
Manipulación de fichas marcadas
Llame a setOnCheckedChangeListener (OnCheckedChangeListener) para registrar una devolución de llamada que se invocará cuando el chip marcado cambie en este grupo. Esta devolución de llamada solo se invoca en el modo de selección única.
si quieres usar setOnCheckedChangeListener()
de ChipGroup
de lo que necesitas hacer app:singleSelection="true"
ACTUALIZAR
en base a su comentario a continuación, he agregado un código de muestra para manejar la selección de ChipGroup
CÓDIGO DE MUESTRA para mantener la selección en 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>
Código de actividad
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) {
}
};
}
Para obtener más información, consulte los artículos a continuación.
- Fichas: componentes de material para Android
- Android P: Chips y ChipGroup
- Exploración de las adiciones a la biblioteca de compatibilidad de diseño de Android v28
Todos los chips deben tener el android:checkable="true"
propiedad para que exista el disparador en ellos.
Además de configurar el control inicial de cualquier chip (sin dar un toque), el orden de ejecución debe ser primero la creación del oyente con chipGroup.setOnCheckedChangeListener()
y luego chip.isChecked = true
.
Por lo tanto, podría manejar la propiedad comprobable del xml e isChecked dinámicamente.
.xml
<com.google.android.material.chip.ChipGroup
..
app:singleSelection="true">
<com.google.android.material.chip.Chip
..
android:checkable="true"/>
.kt
binding.chipGroup.setOnCheckedChangeListener { chipGroup, i ->
}
binding.firstChip.isChecked = true //default
GL
El oyente Chip Click solo funcionará si la selección única se estableció como verdadera en chipGroup.
app:singleSelection="true"
Si está utilizando el estilo que se muestra a continuación, asegúrese de que también se le haya asignado a cada ficha individual.
como esto:
<com.google.android.material.chip.ChipGroup
android:
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:layout_marginEnd="10dp"
app:singleSelection="true">
<com.google.android.material.chip.Chip
android:
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/announcements"
android:textAppearance="@style/ChipThemeBold"/>
<com.google.android.material.chip.Chip
android:
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/fyi"
android:textAppearance="@style/ChipThemeBold"/>
<com.google.android.material.chip.Chip
android:
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/heartbeat"
android:textAppearance="@style/ChipThemeBold" />
<com.google.android.material.chip.Chip
android:
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/pitch"
android:textAppearance="@style/ChipThemeBold" />
<com.google.android.material.chip.Chip
android:
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/question"
android:textAppearance="@style/ChipThemeBold"
android:layout_marginEnd="15dp" />
</com.google.android.material.chip.ChipGroup>