Подтвердить что ты не робот

Как получить рабочий динамический текст ToggleButton под Android?

У меня есть ToggleButton, который настраивается как:

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

и диалоговое окно выглядит так:

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

Идея такова: если ToggleButton включен, в нем появляется диалоговое окно с одним списком, в котором отображается список тегов. Как только тег выбран, он становится новым textOn для ToggleButton. Если ToggleButton выключен (не проверен), текст возвращается к статическому TextOff.

Проблема заключается в том, что кнопка не перерисовывается после того, как диалог исчезнет. Показываемый текст остается прежним значением textOn.

Как я могу заставить перерисовать? Я пробовал filterButton.postInvalidate();, но это не помогло.

4b9b3361

Ответ 1

Решено! Разумное чтение источника ToggleButton показывает, что в то время как setTextOn() и setTextOff() не вызывают вызов (private) syncTextState, который обновляет биты TextView, вызывает вызов setChecked(). Итак, трюк:

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

Что работало довольно хорошо. Yay для open source!