Android 电视 - 如何停止方向键自动导航到下一个焦点?

Android TV - How to stop D-pad auto navigate to next focus?

所有Android位专家,

我正在开发 Android 电视应用。 我在 Dpad 导航上遇到问题。 我想在 KeyDown UP 和 DOWN 时停止自动 Dpad 导航。

我在可聚焦的 TextView 上写了一个监听器,如果 TextView 键向上,则向上滚动列表视图,然后向下键向下滚动。

但是下面的代码无法滚动我的列表视图,当我按下 DOWN 时,我的焦点移动到其他焦点。

有什么解决方案可以覆盖自动对焦导航吗?我希望我的 TextView 在按下向上和向下键时忽略自动导航到下一个焦点。

谢谢。

textView.setOnKeyListener(new View.OnKeyListener(){
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {

            if (event.getAction() == KeyEvent.ACTION_DOWN) {
                switch(keyCode) {
                    case KeyEvent.KEYCODE_DPAD_UP:
                    case KeyEvent.KEYCODE_PAGE_UP:
                        listview_scrollUP();
                        break;

                    case KeyEvent.KEYCODE_DPAD_DOWN:
                    case KeyEvent.KEYCODE_PAGE_DOWN:
                        listview_scrollDOWN();
                        break;
                }
            }
            return false;
        }
    });

经过一番研究,我有了解决问题的想法。

我使用 setDescendantFocusability() 阻止我的其余片段(viewgroup),而我的 dpad 焦点进入目标片段,理想情况下是space 出于我的目的使用 UP 和 DOWN 键(不处理 dpad 导航下一个焦点)。

textview.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                if (hasFocus) {
                    LinearLayout menu = (LinearLayout)getActivity().findViewById(R.id.mainMenuLayout);
                    menu.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
                }
            }
        });

我的目标片段只需要 LEFT 和 RIGHT 让方向键切换到下一个焦点,然后我的 UP 和 DOWN onKey Down 用于滚动列表视图。

setDescendantFocusability() 在方向键导航焦点到达我的片段焦点边缘时启用。

textview.setOnKeyListener(new View.OnKeyListener(){
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {

                if (event.getAction() == KeyEvent.ACTION_DOWN) {
                    switch(keyCode) {
                        case KeyEvent.KEYCODE_DPAD_LEFT:
                            LinearLayout menu = (LinearLayout)getActivity().findViewById(R.id.mainMenuLayout);
                            menu.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS);
                            menuItem1.requestFocus();
                            break;

                        case KeyEvent.KEYCODE_DPAD_UP:
                        case KeyEvent.KEYCODE_PAGE_UP:
                            listview_scrollUP();
                            break;

                        case KeyEvent.KEYCODE_DPAD_DOWN:
                        case KeyEvent.KEYCODE_PAGE_DOWN:
                            listview_scrollDOWN();
                            break;
                    }
                }

                return false;
            }
        });

这就是我解决问题的方法。

希望此信息对其他人有所帮助。

谢谢。