Android: После отмены AlertDialog действие, похоже, теряет фокус

#android #android-alertdialog

#Android #android-alertdialog

Вопрос:

У меня есть действие с кнопкой, нажмите кнопку, чтобы отобразить AlertDialog, это работает нормально. Но после того, как я нажимаю кнопку «ОК» или «Отмена» в AlertDialog, AlertDialog исчезает по желанию, но странно то, что:

После исчезновения AlertDialog активность, похоже, теряет фокус, это означает, что она больше не может получать никаких касаний к ней.

Вот код:

 protected Dialog onCreateDialog(int id, Bundle args)
{
    new AlertDialog.Builder(this).create().show();
    Dialog dialog = null;
    switch(id)
    {
    case...
        break;
    case ID_DIALOG2:
        AlertDialog.Builder builder = new AlertDialog.Builder(ControlDialog.this);
        builder.setTitle("Prompt");
        builder.setMessage("Are you sure to quit?");

        builder.setPositiveButton("OK", new AlertDialog.OnClickListener()
        {
            public void onClick(DialogInterface dialog, int which) 
            {
                Log.e("AlertDialog", dialog.toString()  " "   which);

                // do something else
                dialog.dismiss();    // even without dismiss(), the AlertDialog can disappear too.
                //ControlDialog.this.dismissDialog(ID_DIALOG2); // doesn't work either
               // dialog.cancel();    // doesn't work either
            }

        });  
        builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() 
        {
            public void onClick(DialogInterface dialog, int which) 
            {
                Log.e("AlertDialog", dialog.toString()  " "   which);
                // do something else
                dialog.dismiss();
            }
        });

        dialog = builder.create();
        //dialog.show();
        break;
    }
    return dialog;
}

protected void onPrepareDialog(int id, Dialog dialog)
{
    switch(id)
    {
    case ...
        break;
    case ID_DIALOG2:
        ((AlertDialog)dialog).setTitle("Title");
        ((AlertDialog)dialog).setMessage("Simple Information");
        break;
    }
}

public void onClick(View v)
{
    switch(v.getId())
    {
    case R.id.show_button:
        this.showDialog(ID_DIALOG2, null);
        break;
    case ...
    }
}
  

Извините, я не могу опубликовать изображение : (

После нажатия кнопки «Показать» в действии появляется AlertDialog. После нажатия кнопки «ОК» в AlertDialog, AlertDialog исчезает. НО действие не может получать никаких касаний.

Если я нажму кнопку «НАЗАД» эмулятора, то Действие снова сможет получать касания, и с этого момента оно будет работать довольно хорошо, например, снова нажмите кнопку «Показать», а затем снова нажмите «ОК», после исчезновения AlertDialog действие может получать касания без повторного нажатия на кнопку «НАЗАД» эмулятора.

Итак, кто-нибудь может сказать мне, как решить эту проблему (активность не может получать касания в первый раз)?

TIA

Ответ №1:

Правильно ли работает ваша кнопка «Отмена»? т.Е. Правильно ли выполняется действие после ее нажатия?

Я заметил эту разницу в вашем коде:

 builder.setPositiveButton("OK", new AlertDialog.OnClickListener()

builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener()
  

В первой строке используется AlertDialog.OnClickListener , а во второй используется DialogInterface.OnClickListener . Я только что проверил свой код, и все мои диалоги используют DialogInterface.OnClickListener . Я не уверен, имеет ли это какое-либо значение, но, возможно, стоит попробовать DialogInterface.OnClickListener с помощью вашей кнопки «ОК».

Комментарии:

1. Спасибо, Гэри. Это DialogInterface. Сначала OnClickListener, а затем изменен на AlertDialog. OnClickListener после нескольких неудачных попыток. Я получил тот же результат, используя DialogInterface. OnClickListener или AlertDialog. OnClickListener

2. ОК. И отмена работает нормально? Возможно, вы захотите удалить эту строку: new AlertDialog.Builder(this).create().show(); . Я не уверен, почему это там, но это может вызывать проблемы.

3. Я допустил ошибку. Я забыл удалить первую строку (просто для проверки) в методе onCreateDialog:new AlertDialog. Builder(this).create().show(); и затем все работает нормально…

Ответ №2:

удалить new AlertDialog.Builder(this).create().show();

из вашего кода. Это будет работать абсолютно нормально.