Android SearchView需要点击两次才能展开视图。

7

简短版:当我点击SearchView图标时,SearchView不会折叠/展开。

详细版:

我正在使用一个SearchView来过滤在MainActivity中的Fragment中的RecyclerView。

当我点击SearchView图标(SearchView默认情况下是iconified),我用以下代码打开正确的Fragment选项卡:

searchView.setOnSearchClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                viewPager.setCurrentItem(2, false);
            }
        });

正确的片段选项卡已经打开,文本输入也被显示出来了,但是SearchView仍然保持着图标化状态(如下图所示)。 应用截图 我的XML中的SearchView:
<item
    android:id="@+id/action_search"
    android:orderInCategory="1"
    android:icon="@android:drawable/ic_menu_search"
    android:title="@string/menu_item_search_title"
    app:showAsAction="ifRoom"
    app:queryHint="Search name or function"
    app:actionViewClass="android.support.v7.widget.SearchView" />

我已经尝试过的事情:

将我的showAsAction设置为always或ifRoom|collapseActionView

app:showAsAction="always"
app:showAsAction="ifRoom|collapseActionView"

在我的SearchView上请求焦点:

searchView.requestFocus();

扩展我的SearchViewItem:

MenuItem searchViewItem = menu.findItem(R.id.action_search);
searchViewItem.expandActionView();

但是这些方法都没有奏效...

编辑 就像标题所说的,如果我再次点击SearchView图标,SearchView会展开。


你尝试过使用 MenuItemCompat.expandActionView(searchViewItem) 吗? - Orest
是的,谢谢,我已经尝试过了。 - Kerkhofsd
2个回答

5
我也遇到了类似的问题,并成功解决了它。我需要解决的主要问题是:
  1. 默认情况下,searchView没有展开
  2. 搜索EditText在第二次单击之前无法获得焦点
  3. 即使解决了(2),键盘也不会在第二次单击之前显示
解决方案:
  1. 在menu.xml中需要将app:showAsAction定义为"collapseActionView",并且在java代码中还需要调用searchView.setIconifiedByDefault(false),以便扩展优先于图标化(即当按下图标时,扩展而不保留在图标模式)
  2. 为您的search menu-item object添加一个MenuItem.OnActionExpandListener,并使用处理程序发布一个可运行对象,该对象将请求将焦点放在您的search-view object上。 (为什么是可运行对象?因为在菜单尚未完全膨胀时请求焦点不能保证起作用。在处理程序可运行对象中请求焦点,我确保焦点请求发生在onCreateOptionsMenu()中的所有工作完成后)
  3. 在与(2)定义的可运行对象中,还要求Android操作系统显示键盘。
完整代码解决所有这些问题:

menu.xml:

    <item
    android:id="@+id/searchContacts"
    android:icon="@drawable/ic_search_white_24dp"
    android:title="search"
    app:showAsAction="collapseActionView|always"
    app:actionViewClass="android.widget.SearchView"
    />
 <!-- and of course your other menu items -->

可搜索配置:

需要创建这样的xml文件。 右键单击您的res文件夹,选择新建-->android资源文件。将任何您想要的内容作为文件名(例如,“searchable”将可以工作),并选择XML作为资源类型。 然后将以下代码复制并粘贴到创建的文件中(将提示字符串替换为您自己的):

<?xml version="1.0" encoding="utf-8"?>

<searchable xmlns:android="http://schemas.android.com/apk/res/android"
    android:label="@string/app_name"
    android:hint="put here your hint string to be shown"
    />

MainActivity:

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
        getMenuInflater().inflate(R.menu.menu, menu);
        implementSearch(menu);
        return true;
    }

    private void implementSearch(final Menu menu) {
        SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        final MenuItem searchMenuItem = menu.findItem(R.id.searchContacts);
        final SearchView searchView = (SearchView) searchMenuItem.getActionView();
        searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
        searchView.setIconifiedByDefault(false);

        searchMenuItem.setOnActionExpandListener(new MenuItem.OnActionExpandListener(){
            @Override
            public boolean onMenuItemActionExpand(MenuItem item){
                // the search view is now open. add your logic if you want
                new Handler().post(new Runnable() {
                    @Override
                    public void run() {
                        searchView.requestFocus();
                        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                        if (imm != null) { // it's never null. I've added this line just to make the compiler happy
                            imm.showSoftInput(searchView.findFocus(), 0);
                        }


                    }
                });
                return true;
            }


            @Override
            public boolean onMenuItemActionCollapse(MenuItem item){
                // the search view is closing. add your logic if you want
                return true;
            }

        });

    }

此外,如果您想要使用自己的回调函数来处理搜索文本变更和提交(而不是使用Android intents),则可以在implementSearch()方法中添加一个调用searchMenuItem.setOnActionExpandListener(new SearchView.OnQueryTextListener({...}))

有关更多详情,请查看此 Stack Overflow 问题


1
最简单的解决方案是使用 app:showAsActionalways 选项:

app:showAsAction="always"

<item
android:id="@+id/action_search"
android:icon="@android:drawable/ic_menu_search"
android:title="search"
app:showAsAction="always"
app:actionViewClass="android.widget.SearchView"
/>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接