Не удается установить состояние флажка в onPrepareDialog - PullRequest
1 голос
/ 06 ноября 2010

У меня есть диалог, который показывает список флажков. Информация о том, какие поля следует проверять каждый раз при открытии, поступает из текста редактирования. Я искал способ запретить кэширование диалога, но не мог найти, как это сделать. Теперь я переопределяю onPrepareDialog, чтобы установить флажки перед открытием диалога. Я удалил содержимое моего edittext, открыл диалоговое окно и все еще были отмечены те же поля ... может кто-нибудь сказать мне, как сбросить флажки?

    @Override
    protected void onPrepareDialog(int id, Dialog dialog) {
        ListView lv = ((AlertDialog) dialog).getListView();

        if (lv == null)
            return;

        boolean[] checked = cbDialog.setAndGetCheckedArray();

        String s = "onPrepareDialog... checked=";
        for (int i=0; i<checked.length; i++)
            s+="["+i+"="+checked[i]+"]";
        System.out.println(s);

            // if edittext is empty, all entries in checked[] are false here,
            // but these changes do NOT affect the checkboxes in the dialog:
        for (int i=0; i<checked.length; i++)
            if (checked[i])
                lv.setItemChecked(i, true);
            else 
                lv.setItemChecked(i, false);
    }

Ответы [ 2 ]

1 голос
/ 04 декабря 2010

Похоже, что существует общее мнение о том, что следует избегать управляемых диалогов ('showDialog', 'onCreateDialog' и т. Д.), Если необходимо изменить содержимое для разных экземпляров.В частности, «onPrepareDialog» в форме до или после API уровня 1.8 не имеет смысла.

Другой пример: Вопрос 954726

1 голос
/ 07 ноября 2010

Ну, я наконец-то узнал, как решить эту проблему, возможно, она может кому-нибудь помочь:

Я обнаружил, что (из-за внутреннего механизма кэширования) может быть лучше не вызывать showDialog () в действии и использовать onCreateDialog () для создания диалога, если содержимое диалога изменяется динамически.

Вместо этого я создал класс, который расширяет AlertDialog.Builder. Я реализовал такой метод, как "showCustomDialog ()", где я вызываю .setTitle ..., .setMultiChoiceItems () и, наконец, show (). Этот метод моего пользовательского AlertDialog.Builder я могу использовать в своей деятельности, и все работает как положено;)

...