2010-09-24 16 views
14

Mam ToggleButton które stworzyły jak:Jak mogę uzyskać dynamiczny tekst ToggleButton w Androidzie?

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

i okno wygląda następująco:

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

Chodzi o to: jeśli ToggleButton jest włączona, to pojawia się jedno- okno dialogowe wyboru widoku listy, które jest listą tagów. Po wybraniu znacznika staje się nowym tekstem dla ToggleButton. Jeśli ToggleButton jest wyłączony (unChecked), tekst powraca do statycznego TextOff.

Problem polega na tym, że przycisk nie jest przerysowywany, gdy okno dialogowe zniknie. Wyświetlany tekst jest wciąż poprzednią wartością textOn.

Jak mogę wymusić przerysowanie? Próbowałem filterButton.postInvalidate();, ale to nie pomogło.

Odpowiedz

16

Rozwiązany! Rozsądne odczytywanie źródła do ToggleButton pokazuje, że while setTextOn() i setTextOff() nie powodują wywołania (private) syncTextState, które aktualizuje bity TextView, wywołanie setChecked() ma. Więc sztuczka jest:

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

Co działało całkiem nieźle. Yay dla open source!

+0

+1 to działa. Powinieneś zaakceptować swoją odpowiedź: – ohhorob

+0

Awesome! Dzięki! :) – zleao

+0

Masz absolutną rację, że syncTextState nie jest wywoływany. Możesz jednak wywołać setText (tagNames [który]) bezpośrednio, aby zmienić tekst. – Dandalf

Powiązane problemy