2010-09-24 6 views
14

J'ai un ToggleButton qui est mis en place comme:Comment puis-je obtenir un texte dynamique ToggleButton sous 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()); 
       } 
      } 
     }); 

et la boîte de dialogue ressemble à:

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'idée est: si le ToggleButton est activé, il apparaît un simple boîte de dialogue liste de choix qui est la liste des tags. Une fois qu'un tag est choisi, il devient le nouveau textOn pour le ToggleButton. Si le ToggleButton est désactivé (non vérifié), le texte revient au TextOff statique.

Le problème est le suivant: le bouton n'est pas redessiné une fois la boîte de dialogue disparue. Le texte affiché est toujours la valeur précédente de textOn.

Comment puis-je forcer un redessin? J'ai essayé filterButton.postInvalidate(); mais cela n'a pas aidé.

Répondre

16

Résolu! Une lecture judicieuse de la source à ToggleButton montre que si setTextOn() et setTextOff() ne provoquent pas d'appel à (private) syncTextState qui met à jour les bits TextView, appeler setChecked() fait. Donc, l'astuce est:

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

Qui a fonctionné très bien. Yay pour open source!

+0

+1 cela fonctionne. Vous devriez accepter votre réponse – ohhorob

+0

Awesome! Merci! :) – zleao

+0

Vous avez certainement raison de ne pas être appelé syncTextState. Mais, vous pouvez appeler setText (tagNames [qui]) directement pour changer le texte. – Dandalf

Questions connexes