ボタンを押すと、[OK]ボタンと[キャンセル]ボタンのあるダイアログを開くアプリケーションを開発しています。
正常に動作します。
ユーザーが戻るボタンを押すと、私はこれを次のように処理しています
public boolean onKeyDown(int keyCode, KeyEvent event)
{
if ((keyCode == KeyEvent.KEYCODE_BACK))
{
}
return super.onKeyDown(keyCode, event);
}
ただし、上記のメソッドは呼び出されません。これをどのように処理できますか?
dialog.setOnKeyListener(new Dialog.OnKeyListener() {
@Override
public boolean onKey(DialogInterface arg0, int keyCode,
KeyEvent event) {
// TODO Auto-generated method stub
if (keyCode == KeyEvent.KEYCODE_BACK) {
finish();
dialog.dismiss();
}
return true;
}
});
ダイアログを作成するときにOnCancelListenerを設定したいようです。次のようになります。
dialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
//do whatever you want the back key to do
}
});
OnCancel
メソッドをオーバーライドする必要があります。このメソッドは、Backキーを押すと呼び出されます。これが私にぴったりのコードです。
AlertDialog alertDialog;
alertDialog.setOnCancelListener(new OnCancelListener()
{
@Override
public void onCancel(DialogInterface dialog)
{
// TODO Auto-generated method stub
dialog.dismiss();
}
});
これがあなたの助けになることを望み、それがあなたに役立つならそれを受け入れてください。
ありがとう。
これを試して
new AlertDialog.Builder(this).setOnKeyListener(new DialogInterface.OnKeyListener() {
@Override
public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_BACK){
Logger.d(TAG, "--------- Do Something -----------");
return true;
}
return false;
}
})
これは、ダイアログが開くと、ウィンドウがダイアログに移動するためです。そのため、ダイアログでkey
を処理する必要があります。
DialogFragmentを使用している場合、私が伝えることができることから それを行う正しい方法はonCancel() をオーバーライドすることです
setOnCancelListener
は機能せず、setOnKeyListener
は機能しますが、ダイアログに編集テキストがある場合、すべてのキーを飲み込むという面白い副作用があります。
このコードは機能します:
Dialog dlg = new Dialog(thisAct, R.style.DialogTheme);
dlg.setContentView(view);
dlg.setCancelable(false);
dlg.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
dlg.setOnKeyListener((arg0, keyCode, event) -> {
Timber.d("onKey(%d)", keyCode);
//{home intercepting
if ((keyCode == KeyEvent.KEYCODE_HOME)) {
Timber.i("HOME pressed");
return true;
}
return true;
});
dlg.show();