Android在对话框中覆盖onKeyDown

问题描述 投票:2回答:4

我有一个活动,在打开对话框后立即打开一个对话框:

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    mPath = new File(getIntent().getExtras().getString("START_PATH"));
    FTYPE = getIntent().getExtras().getString("FILTER");

    showDialog(DIALOG_LOAD_FILE);        

}

我正在努力做到这一点,所以当用户单击后退按钮(仍在对话框中时),将退出整个活动。我有以下内容:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {

    if (keyCode == KeyEvent.KEYCODE_BACK) {

            Intent resultIntent = new Intent();
            resultIntent.putExtra("FILE_PATH", mPath.toString());
            setResult(Activity.RESULT_OK, resultIntent);
            finish();           
    }

   return true;
}

如果该对话框不再存在,则效果很好,但是如果该对话框仍处于活动状态,则不会被调用。有想法吗?

android android-activity dialog back-button
4个回答
4
投票

尝试一下

AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
                this);
        // set prompts.xml to alertdialog builder
        alertDialogBuilder.setView(promptsView);
        alertDialogBuilder
        .setCancelable(true);

        // create alert dialog
        final AlertDialog dialogDiscount = alertDialogBuilder.create();

        // show it
        dialogDiscount.show();

        OnKeyListener keylistener = new OnKeyListener() {

            @Override
            public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent KEvent) {
                int keyaction = KEvent.getAction();

                if(keyaction == KeyEvent.ACTION_DOWN)
                {
                    int keycode = KEvent.getKeyCode();
                    int keyunicode = KEvent.getUnicodeChar(KEvent.getMetaState() );
                    char character = (char) keyunicode;
                    if(keycode==KeyCode.Enter){


                    }
                }
                return false;
            }
        };
        dialogDiscount.setOnKeyListener(keylistener );

1
投票

[在实例化onKeyDown()时是否尝试覆盖Dialog类中的Dialog?我尚未测试过,但可以尝试类似

@Override
protected void onCreateDialog(int id) {
    Dialog dialog = null;
    switch(id) {
    case DIALOG_LOAD_FILE:
        dialog = new AlertDialog(mContext) {
            @Override
            public boolean onKeyDown(int keyCode, KeyEvent event) {
                if(keyCode == KeyEvent.KEYCODE_BACK) {
                    dismiss();
                    finish();
                    return true;
                }

                return super.onKeyDown(keyCode, event);
            }
        };   
        break;
    }
    return dialog;
}

1
投票

您必须创建DialogInterface.OnKeyListener的对象,并且可以覆盖onKey(DialogInterface dialog, int keyCode, KeyEvent event)。此方法捕获对话框内的键事件。例如:

AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
//do something to your dialog like: dialogBuilder.setView(view);
DialogKeyListener dkl = new DialogKeyListener();        
dialogBuilder.setOnKeyListener(dkl);
AlertDialog dialog = dialogBuilder.create();
dialog.show();

和侦听器类:

private class DialogKeyListener implements android.content.DialogInterface.OnKeyListener
{
@Override
public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) 
{
    if(keyCode == KeyEvent.KEYCODE_BACK)
    {
        dialog.dismiss();
        yourClassActivity.finish(); // or something like that
        return false;
    }
    return true
}
}

-1
投票
AlertDialog alertDialog = new AlertDialog.Builder(this).create();
alertDialog.setTitle("your title");
alertDialog.setMessage("your message");
alertDialog.setOnCancelListener(new OnCancelListener() {
    @Override
        public void onCancel(DialogInterface dialog) {
          dialog.dismiss();
              finish();
        }
});
alertDialog.show();

FOR ANDROID X

AlertDialog alertDialog = new AlertDialog.Builder(this).create();
        alertDialog.setTitle("your title");
        alertDialog.setMessage("your message");
        alertDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
            @Override
            public void onCancel(DialogInterface dialog) {
                dialog.dismiss();
                finish();
            }
        });
        alertDialog.show();
© www.soinside.com 2019 - 2024. All rights reserved.