¿Cómo puedo hacer que funcione el texto dinámico de ToggleButton en Android?
dynamic (1)
Tengo un ToggleButton que está configurado como:
final ToggleButton filterButton = (ToggleButton) findViewById(R.id.filterTags);
filterButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if (filterButton.isChecked()) {
// pop up the list of tags so the user can choose which to filter by
// once one is chosen, the spinner will be updated appropriately
showDialog(DIALOG_TAGS);
} else {
// going unpressed, set the the spinner list to everything
updateSpinner(db.itemNames());
}
}
});
y el diálogo se ve como:
case DIALOG_TAGS:
final String[] tagNames = db.tagNamesInUse();
dialog = new AlertDialog.Builder(this)
.setItems(tagNames, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
updateSpinner(db.getItemNamesForTag(tagNames[which]));
final ToggleButton filterButton = (ToggleButton) findViewById(R.id.filterTags);
filterButton.setTextOn(tagNames[which]);
dialog.dismiss();
}
})
.setNegativeButton("Cancel", UITools.getDialogCancellingListener())
.create();
La idea es: si ToggleButton está activado, aparece un diálogo de vista de lista de una sola opción que es la lista de etiquetas. Una vez que se elige una etiqueta, se convierte en el nuevo textOn para el ToggleButton. Si el botón ToggleButton está desactivado (sin marcar), entonces el texto vuelve a la opción TextOff estática.
El problema es que el botón no se vuelve a dibujar una vez que desaparece el diálogo. El texto que se muestra sigue siendo el valor anterior de textOn.
¿Cómo puedo forzar un redibujo? Intenté filterButton.postInvalidate();
pero eso no ayudó.
Resuelto La lectura juiciosa de la fuente a ToggleButton muestra que mientras setTextOn () y setTextOff () no causan una llamada a (privado) syncTextState que actualiza los bits de TextView, al llamar a setChecked () sí . Así que el truco es:
dialog = new AlertDialog.Builder(this)
.setItems(tagNames, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
updateSpinner(db.getItemNamesForTag(tagNames[which]));
final ToggleButton filterButton = (ToggleButton) findViewById(R.id.filterTags);
filterButton.setTextOn(tagNames[which]);
filterButton.setChecked(filterButton.isChecked());
dialog.dismiss();
}
})
Lo que funcionó bastante bien. ¡Yay para el código abierto!