我在Google TV应用中有一项活动,显示4列。布局中的顶级窗口小部件是水平LinearLayout,其中包含组成列的窗口小部件。 4列小部件(从左到右)是:Vertical LinearLayout(包含按钮),ListFragment,ListFragment,Vertical LinearLayout(包含TextViews)。
当填充数据时,2个ListFragments比屏幕的可见高度高得多,并且可以单独滚动以在列表上向上/向下移动。这一切都很有效,除了ListFragments上的一些不需要的自动滚动,当我在列之间移动焦点时。
例如,如果我聚焦在第二列的顶部(最左边的ListFragment)并且我使用d-pad将焦点向下移动到可见屏幕的中间,然后我按下右键在d-pad(水平移动到另一个ListFragment中)列表项(在第二个ListFragment中)与第一个ListFragment中的焦点项一起,获得焦点(这是好的)但同时第二个ListFragment自动 - 垂直滚动,将新聚焦的项目推到可见屏幕的顶部(这是不好的)。相反,我希望它保持原样(在列表中间)。
如果我从第二个ListFragment的中间向左移动回到第一个,会发生同样的问题。如果我从第一列中的一个按钮向右移动到第一个ListFragment的中间,也会发生这种情况。
据我所知,这种自动滚动行为可能适用于某些应用程序,但在我的应用程序中它并不合适,并且会导致用户混淆。
答案 0 :(得分: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);
}