首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用D-PAD时的列表视图焦点

使用D-PAD时的列表视图焦点
EN

Stack Overflow用户
提问于 2014-10-01 14:53:35
回答 2查看 2.5K关注 0票数 2

在我的图像中有一个侧边栏和ListView,我通过使用D-PAD访问每个按钮。当侧边栏搜索按钮有焦点时,我按下右D键盘按钮,我希望焦点转到ListView的第一项。但是,在我的例子中,它转到了第二个项目。如果向下箭头有焦点,我按右键它会进入第四个列表item.So,我需要阻止这个also.How将焦点移动到第一个?

代码语言:javascript
复制
if (Search != null && Search.hasFocus()) {
            // Search.setNextFocusRightId(R.id.listView);
//          listView.smoothScrollToPosition(0);
            listView.setChoiceMode(1);
            listView.setItemChecked(0, true);
        }

EN

回答 2

Stack Overflow用户

发布于 2014-10-09 18:05:19

创建一个没有背景的虚拟视图,并将其放置在与列表视图相同的布局中。将其设置为可聚焦,并将搜索视图的nextFocusRight设置为id/dummy。

代码语言:javascript
复制
<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"
    />

您的searchView:

代码语言:javascript
复制
<YourSearchView
 android:nextFocusItemRight=@+id/dummy/>

然后在代码中,将OnFocusChangedListener设置为虚拟视图,这将指示ListView应该获得焦点。在监听器内部,请求listview的焦点,并将selection设置为0,如下所示:

代码语言:javascript
复制
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);
                        }
                    });
                }
            }
        });

确保对nextFocusItemRight使用@+id,而不是@id。希望它能有所帮助,否则请发表评论。

票数 2
EN

Stack Overflow用户

发布于 2014-10-16 22:54:24

最好的做法是覆盖Activity类中的dispatchKeyevent,然后在Listview中将焦点/选择设置到您喜欢的任何位置。

代码语言:javascript
复制
    @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算法,并且焦点/选择将转移到最近的视图。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26135674

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档