showDialog () управляет двумя последовательными диалоговыми окнами, событием поворота и хранителем экрана / кнопкой HOME - PullRequest
2 голосов
/ 25 августа 2011

Кто-нибудь смог создать диалоги, которые могут обрабатывать все из следующих требований:

  1. Сохраняться при изменениях ротации (атрибут android: configChanges не будет использоваться)
  2. Сохраняется при активации экранной заставки (или переходе на ДОМАШНЮЮ СТРАНИЦУ) и возвращении к занятию
  3. Отображение одного диалогового окна сразу после закрытия другого.
  4. Отображение одного диалогового окна сразу после закрытия другого с добавлением поворотов в обоих диалоговых окнах.

Объяснение для двух последовательных диалогов: в одном диалоговом окне отображается вопрос «Вы уверены, что хотите…?».Затем при положительном ответе пользователя выполнить действие и представить результат в диалоговом окне.Это действительно очень распространенная ситуация.

Вот кое-что из того, что я пробовал:

  • Использование AlertDialog.show () вместо showDialog ().Успешное сохранение состояния (включая действия с кликами) в onSaveInstanceState для чтения его в onCreate.Таким образом, диалоги были воссозданы после поворота.Также не было проблем с отображением двух диалогов подряд, т. Е. Маркеров 2 и 3. Последнее, однако, не сработало.Чтобы не пропустить окно, мне пришлось удалить диалоговое окно в onSaveInstanceState (оно будет удалено в любом случае).Тогда я не нашел способа воссоздать его, когда вернулся после активации заставки на моем телефоне.Кто-то знает, какой код будет вызываться при возврате после заставки?Когда я проверял это, ни onCreate, ни onResume, ни onRestoreInstanceState и т. Д. Не вызывались.

  • Использование методов showDialog.Это хорошо работает для маркеров 1 и 3, то есть состояние сохраняется во время вращения (если используются статические диалоговые ссылки), а также правильно обрабатывает экранную заставку.Однако пуля 2 проблематична.Либо второе диалоговое окно вообще не хочет отображаться из-за «Окно уже сфокусировано, игнорируя усиление фокуса ...», либо диалоговые окна перепутаны, либо действие первого диалогового окна выполняется без запроса пользователя.Чтобы продемонстрировать некоторые проблемы, я создал код быстрого теста ниже.

Запуск этого тестового кода на эмуляторе и вращение второго диалогового окна приведет к появлению окна утечки, а затем снова отобразится первое диалоговое окно.

main.xml
 <Button android:layout_width="wrap_content" 
android:layout_height="wrap_content"
android:text="Perform action"
android:onClick="performAction" />


public class ShowDialogTest extends Activity {

private static final int DIALOG_QUESTION = 0;
private static final int DIALOG_INFO = 1;

private static AlertDialog questionDialog;
private static AlertDialog infoDialog;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
}

@Override
public void onResume() {
    super.onResume();

    showQuestionDialog();
}

/**
 * Button click which will bring the dialogs back up.
 */
public void performAction(View v) {
    showQuestionDialog();
}

private void showInfoDialog() {
    createInfoDialog();
    showDialog(DIALOG_INFO);
}

private void showQuestionDialog() {
    createQuestionDialog();
    showDialog(DIALOG_QUESTION);
}

private void createInfoDialog() {
    infoDialog = new AlertDialog.Builder(this).create();

    infoDialog.setTitle("The result");
    infoDialog.setMessage("Info about the result of the action");

    DialogInterface.OnClickListener onClick1 = new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
        }
    };

    infoDialog.setButton(DialogInterface.BUTTON_POSITIVE, "OK", onClick1);
}

private void createQuestionDialog() {
    questionDialog = new AlertDialog.Builder(this).create();

    questionDialog.setTitle("A Question");
    questionDialog.setMessage("Are you sure?");

    DialogInterface.OnClickListener onClick = new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            // Do something here ..

            // Alert the user about the result
            showInfoDialog();
        }
    };

    DialogInterface.OnClickListener onCancelClick = new OnClickListener() {
        public void onClick(DialogInterface dialog, int which) {
        }
    };

    questionDialog
            .setButton(DialogInterface.BUTTON_POSITIVE, "OK", onClick);
    questionDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "Cancel",
            onCancelClick);
}

@Override
protected Dialog onCreateDialog(int id) {
    switch (id) {
    case DIALOG_QUESTION:
        return questionDialog;
    case DIALOG_INFO:
        return infoDialog;
    }

    // Error case (should be handled better ;)
    return new Dialog(this);
}

PS.Причина использования методов диалогового окна создания заключается в том, что Activity должен поместить в диалог пользовательский текст и действия кнопок перед его отображением.Это не показано в коде.DS

Я читал другие посты на форуме и пробовал другие вещи.Пожалуйста, отвечайте, только если вы знаете, как это исправить без создания новых проблем.Вы, конечно, можете добавить предложения в комментарии.

Спасибо за ваше время

Ответы [ 2 ]

0 голосов
/ 07 марта 2012

Основная проблема заключалась в том, что я объявил диалоги в Activity, а не в методе onCreateDialog ().Т.е. не делает это:

private static AlertDialog questionDialog;

Обязательно также объявите объект OnClickListener в методе onCreateDialog ().

Это обеспечивает выполнение пунктов 1, 3 и 4.Так как showDialog () используется, пуля 2 выполняется.Это просто не работает с методом AlertDialog.show ().

0 голосов
/ 25 августа 2011

попробуйте это:

@Override
protected Dialog onCreateDialog(int id) {
    AlertDialog dialog = new AlertDialog.Builder(this).create();
    if(id == yourCodeValue){
    LayoutInflater inflator = LayoutInflater.from(context);
    View view = inflator.inflate(R.layout.yourview, null);
    Button positive = (Button)view.findViewById(R.id.btn_positive);
    Button negative = (Button)view.findViewById(R.id.btn_negative);

    positive.setOnClickListener(new Button.OnClickListener(){
        public void onClick(View v) {
            removeDialog(0);
        }
    });

    negative.setOnClickListener(new Button.OnClickListener(){
        public void onClick(View v) {
            removeDialog(0);
        }
    });


    dialog.setView(view);
   }
    return dialog;
}

Показать это диалоговое окно, используя showDialog(int value).

Это решит ваши первые 2 очка, а 3 и 4 балла - вам решать, как вы справитесь с этим..

...