2

在我的图像中有一个侧边栏和 ListView,我使用 D-PAD 访问每个按钮。当侧边栏搜索按钮具有焦点并且我按下右 D-PAD 按钮时,我希望焦点转到 ListView 的第一项。但是,就我而言,它转到第二项。如果向下箭头有焦点并且我按下右键它会转到第 4 个列表项。所以,我也需要防止这种情况发生。如何将焦点移到第一个?

if (Search != null && Search.hasFocus()) {
            // Search.setNextFocusRightId(R.id.listView);
//          listView.smoothScrollToPosition(0);
            listView.setChoiceMode(1);
            listView.setItemChecked(0, true);
        }

在此处输入图像描述

4

2 回答 2

2

制作一个没有背景的虚拟视图,并将其放置在与列表视图相同的布局中。使其可聚焦并将搜索视图的 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 应该获得焦点。在侦听器中,请求列表视图的焦点并将选择设置为 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。希望对您有所帮助,否则发表评论。

于 2014-10-09T10:05:19.440 回答
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;

但是,如果您要处理焦点或选择逻辑,请记住返回“true”,否则它将调用 android focusfinder 算法并且焦点/选择将转移到最近的视图。

于 2014-10-16T14:54:23.793 回答