0

我在 Google TV 应用中有一个活动,它显示 4 列。布局中的顶级小部件是水平 LinearLayout,其中包含构成列的小部件。4 列小部件(从左到右)是:Vertical LinearLayout(包含按钮)、ListFragment、ListFragment、Vertical LinearLayout(包含 TextViews)。

当填充数据时,2 个 ListFragments 比屏幕的可见高度高得多,并且可以独立滚动以在列表上向上/向下移动。当我在列之间移动焦点时,这一切都很好,除了 ListFragments 上的一些不需要的自动滚动。

例如,如果我将焦点放在第 2 列的顶部(最左侧的 ListFragment)并且我使用 d-pad 将焦点向下移动到可见屏幕的中间,然后我按下 d 上的右键-pad(水平移动到另一个 ListFragment)列表项(在第 2 个 ListFragment 中)与第一个 ListFragment 中的焦点项并排接收焦点(这很好),但同时第 2 个 ListFragment 自动垂直滚动, 将新聚焦的项目推到可见屏幕的顶部(这很糟糕)。相反,我希望它保持原样(在列表中间)。

如果我从第二个 ListFragment 的中间向左移动,回到第一个,也会出现同样的问题。如果我从第一列中的一个按钮向右移动到第一个 ListFragment 的中间,也会发生这种情况。

我知道这种自动滚动行为对于某些应用程序可能是可取的,但在我的应用程序中它并不真正合适,并且会导致用户混淆。

4

1 回答 1

1

这似乎是平行垂直片段之间的 ListView d-pad 导航中的一个错误。请尝试在平板电脑上重现它并在 Android 问题跟踪器中提交错误。

同时,您可以使用以下解决方法:

  @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        // workaround to handle keyevent dpad-right from left list to right list, to 
        // to prevent default behavior of focused item on right list snapping to top.             
        if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) {
            if (left_list != null && right_list != null && left_list.isFocused()){
                right_list.setSelection(right_list_selected_index);
                right_list.requestFocus();
                return true;
            }
        } 
        return super.onKeyDown(keyCode, event);
    }
于 2012-05-10T19:05:28.287 回答