Диалоговое окно Android закрывается при любом физическом нажатии клавиши

#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 — нажатие клавиши)