2010-09-24 13 views
14

Tengo un ToggleButton que se ha configurado como:¿Cómo puedo obtener el texto dinámico de ToggleButton en Android?

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 parece a:

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 el ToggleButton está activada, se hace aparecer una sola lista de diálogo lista de elección que es la lista de etiquetas. Una vez que se elige una etiqueta, se convierte en la nueva entrada de texto para ToggleButton. Si ToggleButton está desactivado (sin marcar), el texto vuelve al TextOff estático.

El problema es que el botón no se está redibujando una vez que el diálogo desaparece. El texto que muestra sigue siendo el valor anterior de textOn.

¿Cómo puedo forzar un redibujado? Intenté filterButton.postInvalidate(); pero eso no ayudó.

Respuesta

16

¡Solucionado! La lectura juiciosa de la fuente a ToggleButton muestra que aunque setTextOn() y setTextOff() no provocan una llamada a (privado) syncTextState que actualiza los bits de TextView, al llamar a setChecked() hace. Entonces 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 cual funcionó muy bien. ¡Yay por código abierto!

+0

+1 esto funciona. Debe aceptar su respuesta – ohhorob

+0

¡Impresionante! ¡Gracias! :) – zleao

+0

Tiene toda la razón al decir que no se llama a syncTextState. Pero, puedes llamar a setText (tagNames [which]) directamente para cambiar el texto. – Dandalf

Cuestiones relacionadas