Android: как переопределить onBackPressed() в AlertDialog?

У меня есть AlertDialog dlgDetails который показан из другого AlertDialog dlgMenu, Я хотел бы иметь возможность снова показывать dlgMenu, если пользователь нажимает кнопку возврата в dlgDetails, и просто выходить из диалогового окна, если он нажимает вне диалогового окна.

Я думаю, что лучший способ сделать это - переопределить onBackPressed для dlgDetails, но я не уверен, как это сделать, поскольку AlertDialogs должен создаваться косвенно с помощью Builder.

Я пытаюсь создать производный AlertDialog (public class AlertDialogDetails extends AlertDialog { ...}) но тогда я думаю, что я должен также расширить AlertDialog.Builder в этом классе, чтобы вернуть AlertDialogDetails, но нет ли более простого способа? А если нет, как бы вы переопределили Строителя?

5 ответов

Решение

Наконец, я добавил ключевой слушатель в свой диалог, чтобы прослушать клавишу Назад. Не так элегантно, как переопределение onBackPressed() но это работает. Вот код:

dlgDetails = new AlertDialog.Builder(this)
    .setOnKeyListener(new DialogInterface.OnKeyListener() {
        @Override
        public boolean onKey (DialogInterface dialog, int keyCode, KeyEvent event) {
            if (keyCode == KeyEvent.KEYCODE_BACK && 
                event.getAction() == KeyEvent.ACTION_UP && 
                !event.isCanceled()) {
                dialog.cancel();
                showDialog(DIALOG_MENU);
                return true;
            }
            return false;
        }
    })
    //(Rest of the .stuff ...)

Нашел более короткое решение:) попробуйте это:

         accountDialog = builder.create();

        accountDialog.setOnCancelListener(new OnCancelListener() {

            @Override
            public void onCancel(DialogInterface dialog) {
                dialog.dismiss();
                activity.finish();

            }
        });

Это обрабатывает как кнопку НАЗАД, так и щелчок ВНЕ диалогового окна:

yourBuilder.setOnCancelListener(new OnCancelListener() {
    @Override
    public void onCancel(DialogInterface dialog) {
        dialog.cancel();
        // do your stuff...
    }
});

dialog.cancel() это ключ: с dialog.dismiss() это будет обрабатывать только щелчок за пределами диалога, как ответили выше.

Я создал новую функцию в классе java и вызвал эту функцию из метода onClick построителя диалогов.

public class Filename extends Activity(){

@Override
onCreate(){
 //your stuff
 //some button click launches Alertdialog
}

public void myCustomDialog(){
 AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
 //other details for builder
      alertDialogBuilder.setNegativeButton("BACK",
            new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
                         dialod.dismiss;
                         myCustomBack();
                    }
      });

 AlertDialog alertDialog = alertDialogBuilder.create();
 alertDialog.setCanceledOnTouchOutside(true);
 alertDialog.show();
}

public void myCustomBack(){
  if(condition1){
    super.onBackPressed();
  }
  if(condition 2){
    //do  stuff here
  }
}

@Override
public void onBackPressed(){
  //handle case here
  if (condition A)
    //Do this
  else 
    //Do that
}

}

Вот фактическое решение для С#, основанное на ответе Pooks:

Во-первых, мы должны создать новый класс для обработки события:

      private sealed class KeyListener : Java.Lang.Object, IDialogInterfaceOnKeyListener
{
    private readonly Action _action;

    public KeyListener(Action action)
    {
        _action = action;
    }

    public bool OnKey(IDialogInterface dialog, [GeneratedEnum] Android.Views.Keycode keyCode, KeyEvent e)
    {
        var isBack = keyCode == Android.Views.Keycode.Back
            && e.Action == KeyEventActions.Up
            && !e.IsCanceled;

        if (isBack)
            _action.Invoke();

        return isBack;
    }
}

И нам нужно действие для получения события:

      private void OnBackPressed()
{
    // ... do the stuff
}

Теперь мы можем настроить это событие:

      var dlgDetails = new AlertDialog.Builder(this)
    .SetOnKeyListener(new KeyListener(OnBackPressed))
    // add further set ups
    .Create();
Другие вопросы по тегам