我正在尝试为只能使用d-pad遍历的启动器应用程序创建一个界面。我的布局是分层的,每个顶层项目都有一个选项列表。要导航到第二个列表,用户可以按该项目或按向右。
问题在于,由于Android根据位置确定要聚焦的正确视图的方式,光标会跳到错误的项目(光标旁边的所有内容)。参见下面的图1;如果用户按向右,则将突出显示“开发工具”而不是“ API演示”。
回到左侧也是如此。在图2中,当用户按向右时,将选择“音乐”而不是“应用程序”。
到目前为止,我已经尝试了以下方法来手动选择正确的视图:
appListView.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if(hasFocus) {
((ListView) v).getChildAt(0).requestFocus();
} else {
findViewById(R.id.apps_button).requestFocus();
}
}
});
这失败了(我认为),因为dpad操作已经触发了requestFocus,并且我已经验证我得到了正确的子视图,该子视图是可聚焦的,并且requestFocus()返回false;
我怎样做才能使这项工作按预期进行?提前致谢 :)
编辑1:
我还尝试将应用程序按钮NextFocusRightId设置为列表视图的第一项(通过列表适配器@位置0编程设置);没有。
编辑2:
NextFocus___Id也正在处理这些按钮,因为视频的上焦点是“设置”,所以效果很好...
最佳答案
我终于想通了!
最好通过ListView本身来手动调整列表项的焦点。通过进行以下更改扩展ListView类,它可以干净地向右移动:
@Override
protected void onFocusChanged(boolean gainFocus, int direction, Rect previouslyFocusedRect) {
if(gainFocus) {
setSelection(0);
} else {
super.onFocusChanged(gainFocus, direction, previouslyFocusedRect);
}
}
并通过仅将listview的NextFocusLeft设置为左侧(而不是项目):
appListView.setNextFocusLeftId(R.id.apps_button);