在我的Image中有一个侧边栏和ListView,我使用D-PAD访问每个Button。 当侧栏搜索按钮具有焦点并按下右侧D-PAD按钮时,我希望焦点转到ListView的第一项。但是,在我的情况下,它转到第二项。如果向下箭头有焦点,我按下右键,它会进入第4个列表项。所以,我也需要阻止它。如何将焦点移动到第1个?
if (Search != null && Search.hasFocus()) {
// Search.setNextFocusRightId(R.id.listView);
// listView.smoothScrollToPosition(0);
listView.setChoiceMode(1);
listView.setItemChecked(0, true);
}
答案 0 :(得分:2)
制作没有背景的虚拟视图,并将其放置在与列表视图相同的布局中。 使其可聚焦并将Search视图的nextFocusRight设置为id / dummy。
<ListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:choiceMode="singleChoice"
android:listSelector="@null"
android:background="@null"
></ListView>
<View
android:id="@+id/dummy"
android:layout_width="1dp"
android:layout_height="1dp"
android:focusable="true"
/>
您的搜索视图:
<YourSearchView
android:nextFocusItemRight=@+id/dummy/>
然后在代码中,将OnFocusChangedListener设置为虚拟视图,这将指示ListView应该获得焦点。在侦听器内部,请求listview的焦点,并将选择设置为0,如下所示:
View dummy = rootView.findViewById(R.id.dummy);
dummy.setOnFocusChangeListener(new View.OnFocusChangeListener()
{
@Override public void onFocusChange(View v, boolean hasFocus)
{
if (hasFocus)
{
listView.post(new Runnable() {
@Override
public void run() {
listView.requestFocus();
listView.setSelection(0);
}
});
}
}
});
确保将@ + id用于nextFocusItemRight而不是@id。 希望它有所帮助,否则发表评论。
答案 1 :(得分:2)
最好的办法是覆盖Activity类中的dispatchKeyevent,然后将焦点/选择设置到Listview中您喜欢的位置。
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
boolean handled = super.dispatchKeyEvent(event);
if(!handled && event.getAction() == KeyEvent.ACTION_UP)
{
if(yourParentViewGroup.getFocusedChild() is your SearchView && event.getKeyCode() == KeyEvent.KEYCODE_DPAD_RIGHT )
{
yourListvIew.setSelction(0);
handled = true;
}
}
return handled;
但是如果要处理Focus或选择逻辑,请记住返回“true”,否则它将调用android focusfinder算法,焦点/选择将转移到最近的View。