【问题标题】:Android SearchView requires two clicks to expand the viewAndroid SearchView 需要点击两次才能展开视图
【发布时间】:2016-06-01 00:37:18
【问题描述】:

简短:当我点击我的 SearchViewIcon 时,SearchView 不会折叠/展开。

长:

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

当我点击 SearchViewIcon 时(SearchView 默认是图标化的)。我使用以下代码打开带有正确片段的选项卡:

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

具有正确片段的选项卡按预期打开。还显示了文本输入,但 SearchView 保持图标化。 (见下图)

Application

我的 XML 搜索视图:

<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();

但这些都不起作用......

编辑 正如标题所说,如果我再次单击 SearchViewIcon,SearchView 会展开。

【问题讨论】:

  • 您是否尝试过使用 MenuItemCompat.expandActionView(searchViewItem) ?
  • 是的,谢谢,我已经试过了。

标签: android android-recyclerview searchview


【解决方案1】:

我也遇到过类似的问题,并且能够解决。 我需要解决的主要问题是:

  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) 中定义的 runnable 中,还要求 android OS 显示键盘。

解决所有这些问题的完整代码:

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 文件夹并选择new --&gt; android resource file。将您想要的任何内容作为文件名(例如,“可搜索”可以正常工作),然后选择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"
    />

主活动:

    @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 意图),请在 implementSearch() 方法中添加对 searchMenuItem.setOnActionExpandListener(new SearchView.OnQueryTextListener({...})) 的调用。

查看this SO question了解更多详情

【讨论】:

    【解决方案2】:

    最简单的解决方案是为app:showAsAction 使用always 选项:

    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"
    />
    

    【讨论】:

      猜你喜欢
      • 2016-06-08
      • 2018-01-08
      • 1970-01-01
      • 2013-11-16
      • 2023-03-17
      • 1970-01-01
      • 2013-07-01
      • 1970-01-01
      • 2011-03-15
      相关资源
      最近更新 更多