2010-09-24 14 views
14

Ho una ToggleButton che è impostato su come:Come posso ottenere un testo dinamico ToggleButton funzionante su 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()); 
       } 
      } 
     }); 

e la finestra si presenta come:

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(); 

L'idea è: se il ToggleButton è acceso, esso apre una singola finestra di dialogo lista di scelta scelta che è la lista di tag. Una volta che un tag viene scelto, diventa il nuovo textOn per ToggleButton. Se ToggleButton è disattivato (unChecked), il testo ritorna a TextOff statico.

Il problema è: il pulsante non viene ridisegnato quando la finestra di dialogo scompare. Il testo visualizzato è ancora il valore precedente di textOn.

Come posso forzare un ridisegno? Ho provato filterButton.postInvalidate(); ma quello non ha aiutato.

risposta

16

Risolto! La lettura giudiziosa dell'origine su ToggleButton mostra che mentre setTextOn() e setTextOff() non causano una chiamata a syncTextState (privato) che aggiorna i bit TextView, chiamando setChecked() fa. Quindi il trucco è:

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(); 
        } 
       }) 

Che ha funzionato abbastanza bene. Yay per l'open source!

+0

+1 funziona. Dovresti accettare la tua risposta – ohhorob

+0

Fantastica! Grazie! :) – zleao

+0

Hai sicuramente ragione sul fatto che syncTextState non venga chiamato. Ma puoi chiamare setText (tagNames [which]) direttamente per cambiare il testo. – Dandalf

Problemi correlati