Потеря фокуса ввода на AndroidTV

У меня довольно странная ошибка на AndroidTV.

Я открываю AlertDialog в приложении и в 10-20% случаев я полностью теряю фокус удаленного ввода. Кнопки, которые обрабатываются глобально (например, HOME), работают правильно, но DPAD, OK и другие кнопки дистанционного управления ничего не делают.

В logcat я вижу это:

W: Cancelling event due to no window focus: KeyEvent { action=ACTION_UP, keyCode=KEYCODE_DPAD_LEFT, scanCode=105, metaState=0, flags=0x28, repeatCount=0, eventTime=4748412, downTime=4748300, deviceId=9, source=0x301 }    
W: Dropping event due to no window focus: KeyEvent { action=ACTION_DOWN, keyCode=KEYCODE_DPAD_LEFT, scanCode=105, metaState=0, flags=0x8, repeatCount=0, eventTime=4748468, downTime=4748468, deviceId=9, source=0x301 }    
W: Cancelling event due to no window focus: KeyEvent { action=ACTION_UP, keyCode=KEYCODE_DPAD_LEFT, scanCode=105, metaState=0, flags=0x28, repeatCount=0, eventTime=4748570, downTime=4748468, deviceId=9, source=0x301 }

Я проверил вывод adb shell dumpsys window на наличие каких-либо аномалий фокуса, но ничего странного.

Я предполагаю, что фокус чем-то блокируется, но я понятия не имею, что это может быть. Буду признателен за любые советы.


person Kelevandos    schedule 29.05.2019    source источник


Ответы (2)


Не видел ваш код, но это может быть проблема с гонкой, потому что вы упомянули, что это «10-20% случаев». У вас может быть два способа выяснить это. 1. Попробуйте добавить журналы в метод onKeyDown или onKeyUp в свою активность, чтобы увидеть, что произойдет, когда вы нажмете кнопки на пульте дистанционного управления. 2. Вызовите «yourview.requestFocus()» в своем диалоговом окне при запуске. Обратите внимание, что ваше представление является корневым представлением для вашего диалога, просто измените его на любое для вашего случая.

person Jason    schedule 06.06.2019

Инициализируйте свою кнопку и установите ключевой прослушиватель на вашей кнопке, как это

yourButton.setOnKeyListener(new View.OnKeyListener() {
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            if (event.getAction() == KeyEvent.ACTION_DOWN) {
                if (keyCode == KeyEvent.KEYCODE_ENTER) {
                    // your code here
                    return true;

                } else if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
                    return true;
                }

                else if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) {
                    return true;
                }

                else if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) {
                    return true;
                }

                else if (keyCode == KeyEvent.KEYCODE_DPAD_UP) {
                    return true;
                }
                else if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN) {
                    return true;
                }
            }
            return false;
        }
    }); 

Некоторые ключевые моменты, на которые стоит обратить внимание:

  1. Для выполнения действия на устройстве используйте центральную кнопку DPAD, а при тестировании на эмуляторе используйте кнопку KEYCODE Enter.

  2. у вашего avd должен быть включен dpad. Вы можете установить их в настройках avd.

person Andrain    schedule 11.06.2019