Потеря фокуса ввода на AndroidTV - PullRequest
0 голосов
/ 29 мая 2019

У меня довольно странная ошибка на 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 вывод для любых аномалий фокуса, но ничто не кажется странным.

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

Ответы [ 2 ]

0 голосов
/ 11 июня 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.

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

0 голосов
/ 06 июня 2019

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

...