#android #android-dialog #keyevent
Вопрос:
У меня есть этот диалог, только с текстовым представлением и без кнопок. Он отображает некоторую информацию, и мне нужно изменить информацию при нажатии клавиши влево и вправо. К сожалению, диалоговое окно закрывается при нажатии любой клавиши. Этот код в MainActivity вызывает диалоговое окно (избыточный код опущен).
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
if (event.getKeyCode() == KeyEvent.KEYCODE_MENU) {
if (event.getAction() == KeyEvent.ACTION_UP) {
InfoDialog infoDialog = new InfoDialog();
infoDialog.showDialog(this,currentDateAndTime,chn);
return true;
}
}
return super.dispatchKeyEvent(event);
}
и это код диалогового окна
public class InfoDialog {
private int counter = 0;
private Dialog dialog;
public void showDialog(final Activity activity, final String DateTime, final ChannelList.Channel chn){
dialog = new Dialog(activity);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setCancelable(false);
dialog.setContentView(R.layout.info_dialog);
counter = 0;
setDialogText(chn,DateTime,counter);
dialog.setOnKeyListener(new DialogInterface.OnKeyListener() {
@Override
public boolean onKey(DialogInterface dialogInterface, int i, KeyEvent keyEvent) {
if (keyEvent.getKeyCode() == KeyEvent.KEYCODE_DPAD_LEFT) {
if (keyEvent.getAction() == KeyEvent.ACTION_UP) {
if (counter>0) counter--;
setDialogText(chn,DateTime,counter);
return true;
}
}
if (keyEvent.getKeyCode() == KeyEvent.KEYCODE_DPAD_RIGHT) {
if (keyEvent.getAction() == KeyEvent.ACTION_UP) {
if (counter<chn.infoText.size()-1) counter ;
setDialogText(chn,DateTime,counter);
return true;
}
}
dialog.dismiss();
return false;
}
});
dialog.show();
}
}
когда я нажимаю любую кнопку, диалоговое окно закрывается, даже если была вызвана клавиша включения.
Я что-то пропустил? как мне обрабатывать нажатия клавиш только для моего диалога? (в других диалоговых окнах могут использоваться одни и те же клавиши для разных операций)
Ответ №1:
ну, внутри InfoDialog
вы устанавливаете DialogInterface.OnKeyListener
и в нижней части onKey
метода , который вы вызываете dialog.dismiss()
, попробуйте удалить эту строку… (а также return true
для любого случая)
Комментарии:
1. Спасибо, я думал, что возврат в If пропустил бы увольнение и заставил бы его выйти из метода OnKey
2. это было бы так, но у вас есть
return
строки только в том случае , если клавиша естьKEYCODE_DPAD_LEFT
илиKEYCODE_DPAD_RIGHT
действие естьACTION_UP
, любая другая пара клавиша действие вызоветdismiss
(так что дажеKEYCODE_DPAD_LEFT
ACTION_DOWN
— нажатие клавиши)