Android:如何覆盖AlertDialog中的onBackPressed()?

hgqdbh6s  于 2022-12-31  发布在  Android
关注(0)|答案(5)|浏览(146)

我有一个AlertDialog dlgDetails,它是从另一个AlertDialog dlgMenu显示的。我希望能够在用户按下dlgDetails中的“后退”按钮时再次显示dlgMenu,并且在用户按下对话框外部的按钮时简单地退出对话框。
我认为最好的方法是为dlgDetails覆盖onBackPressed,但我不确定如何实现,因为AlertDialogs必须使用Builder间接创建。
我尝试创建一个派生的AlertDialog(public class AlertDialogDetails extends AlertDialog { ...}),但我想我还必须在该类中扩展AlertDialog.Builder以返回AlertDialogDetails,但有没有更简单的方法?如果没有,您将如何覆盖构建器?

j91ykkif

j91ykkif1#

最后我在对话框中添加了一个键监听器来监听Back键。虽然没有覆盖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 ...)

答案在Kotlin看到这里:Not working onbackpressed when setcancelable of alertdialog is false

mnowg1ta

mnowg1ta2#

找到了一个更短的解决方案:)试试这个:

accountDialog = builder.create();

        accountDialog.setOnCancelListener(new OnCancelListener() {

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

            }
        });
mznpcxlj

mznpcxlj3#

这将处理“后退”按钮和在对话框外部单击:

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

dialog.cancel()是密钥:对于dialog.dismiss(),这将仅处理对话框外部的点击,如上所述。

kmb7vmvb

kmb7vmvb4#

我在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
}

}
3npbholx

3npbholx5#

下面是一个基于answer from Pooks的C#实际解决方案:
首先,我们必须创建一个新类来处理事件:

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();

相关问题