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

时间:2016-02-19 12:23:20

标签: android android-recyclerview searchview

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

长:

我使用SearchView过滤MainActivity中片段中的RecyclerView。

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

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

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

Application

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

但这些事情没有奏效......

EDIT 就像标题所说,如果我再次点击SearchViewIcon,SearchView会扩展。

2 个答案:

答案 0 :(得分:3)

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

  1. searchView未默认展开
  2. 搜索EditText直到第二次点击
  3. 才获得焦点
  4. 即使在解决(2)之后,键盘也没有出现,直到第二次点击
  5. 解决方案:

      在menu.xml中
    1. 需要将app:showAsAction定义为"collapseActionView" +在java代码中还需要调用searchView.setIconifiedByDefault(false)以使扩展优先于图标化(即 - 当图标时按下,展开,不要停留在图标模式下)
    2. 为您的MenuItem.OnActionExpandListener添加search menu-item object,并使用处理程序发布一个可以请求关注search-view object的runnable。 (为什么可以运行?因为在菜单仍未完全膨胀时请求焦点不能保证工作。当在处理程序中运行请求焦点时,我确保焦点请求在onCreateOptionsMenu()中的所有工作之后发生准备就绪并完成。
    3. 在(2)中定义的runnable中,也要求android OS显示键盘。
    4. 解决所有这些问题的完整代码:

        

      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 --> android resource file。把你想要的任何东西作为文件名(例如,“searchable”可以正常工作),并选择XML作为资源类型。 然后复制&amp;将此代码粘贴到创建的文件中(用您自己的替换提示字符串):

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

      查看this SO question了解更多详情

答案 1 :(得分:1)

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

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