3

У меня есть диалоговое окно предупреждения с полем ввода и двумя кнопками (возврат, сохранение). Когда я нажимаю кнопку «назад» на своем телефоне, я хочу открыть еще один диалог подтверждения: «Вы действительно хотите закончить?». Так что все это выглядит следующим образом:Android: AlertDialog закрывается только после второго нажатия на любую кнопку

public void showNewItemDialog(final int...position) { 
    LayoutInflater li = LayoutInflater.from(HostActivity.this); 
    View promptsView = li.inflate(R.layout.item_dialog, null); 
    AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
      HostActivity.this); 
    alertDialogBuilder.setView(promptsView); 
    userInput = (EditText) promptsView.findViewById(R.id.editTextDialogUserInput); 
    if(position.length>0){ 
     userInput.setText(listFragment.getmItems().get(position[0]).getTitle()); 
     userInput.setSelection(userInput.length()); 
     userInput.requestFocus(); 
    } 
    alertDialogBuilder 
      .setCancelable(false) 
      .setPositiveButton("OK", 
        new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int id) { 
          String title = userInput.getText().toString(); 
          if(listFragment.getItemClickType() == Utility.ItemClick.SHORT){ 
           listFragment.editRowItem(title, position[0]); 
          }else if(listFragment.getItemClickType() == Utility.ItemClick.LONG){ 

          }else if(listFragment.getItemClickType() == Utility.ItemClick.ADD_BUTTON){ 
           listFragment.addRowItem(title); 
          } 

         } 
        }) 
      .setNegativeButton("Revert", 
        new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int id) { 
          dialog.cancel(); 
         } 
        }); 
    newItemalertDialog = alertDialogBuilder.create(); 

    newItemalertDialog.setOnKeyListener(new Dialog.OnKeyListener() { 
     @Override 
     public boolean onKey(DialogInterface arg0, int keyCode, 
          KeyEvent event) { 
      if (keyCode == KeyEvent.KEYCODE_BACK) { 
       new AlertDialog.Builder(HostActivity.this) 
         .setIcon(android.R.drawable.ic_dialog_alert) 
         .setTitle("Add Item") 
         .setMessage("Are you sure you want to finish?") 
         .setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
          @Override 
          public void onClick(DialogInterface dialog, int which) { 
           dialog.dismiss(); 
           newItemalertDialog.dismiss(); 
          } 
         }).setNegativeButton("No", null).show(); 
      } 
      return false; 
     } 
    }); 
    newItemalertDialog.show(); 
} 

Это все работает, но второе окно подтверждения закрывается только после того, как я нажимаю два раза на любую кнопку (Нет, Да). Кажется, я не могу найти причину этого. Спасибо.

ответ

2

метод OnKey вызывается дважды: первый раз для ключа вниз, и второй раз для ключа вверх, так что вы должны фильтровать:

Меняет ниже кода

newItemalertDialog.setOnKeyListener(new Dialog.OnKeyListener() { 
     @Override 
     public boolean onKey(DialogInterface arg0, int keyCode, 
          KeyEvent event) { 
      if (event.getAction() != KeyEvent.ACTION_DOWN) 
       return true; 

       if (keyCode == KeyEvent.KEYCODE_BACK) { 
         new AlertDialog.Builder(MemberShipActivity.this) 
          .setIcon(android.R.drawable.ic_dialog_alert) 
          .setTitle("Add Item") 
          .setMessage("Are you sure you want to finish?") 
          .setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
           @Override 
           public void onClick(DialogInterface dialog, int which) { 
            dialog.cancel(); 
            newItemalertDialog.dismiss(); 
           } 
          }).setNegativeButton("No", null).show(); 
        Log.e("Key","back"); 
       } 
      return false; 
     } 
    }); 
+0

Отлично! Спасибо. – Sermilion

0
@Override 
public void onBackPressed() { 
    AlertDialog.Builder builder = new AlertDialog.Builder(this); 
    builder.setMessage("Are you sure you want to exit?") 
      .setCancelable(false) 
      .setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 
        MyActivity.this.finish(); 
       } 
      }) 
      .setNegativeButton("No", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 
        dialog.cancel(); 
       } 
      }); 
    AlertDialog alert = builder.create(); 
    alert.show(); 

} 

попробуйте этот код. при нажатии на кнопку OnBackPressed метод вызовет. поэтому вы можете добавить приглашение туда.

Смежные вопросы