Android 搜索视图在工具栏上的行为不正确

Android search view not behaving right on toolbar

你有显示我的应用程序实际行为的视频: https://www.youtube.com/watch?v=81XIdEo0lks&feature=youtu.be 你看,当我点击搜索图标时,它只是将它移到左侧,然后我需要再次点击它,然后我需要点击 x 按钮 2 次才能真正退出搜索视图,一团糟. 以下是我希望我的搜索视图的行为方式: https://www.youtube.com/watch?v=sJ-Z9G0SDhc&t

MainActivity.java(仅相关部分)

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.options_menu, menu);

        MenuItem searchItem = menu.findItem(R.id.app_bar_search);

        SearchManager searchManager = (SearchManager) MainActivity.this.getSystemService(Context.SEARCH_SERVICE);

        SearchView searchView = null;
        if (searchItem != null) {
            searchView = (SearchView) searchItem.getActionView();
        }
        if (searchView != null) {
            searchView.setSearchableInfo(searchManager.getSearchableInfo(MainActivity.this.getComponentName()));
        }

        return super.onCreateOptionsMenu(menu);
    }

options_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/app_bar_search"
        android:icon="@drawable/ic_search_black_24dp"
        android:title="Search"
        app:showAsAction="ifRoom|collapseActionView"
        app:actionViewClass="android.widget.SearchView" />
    <item
        android:id="@+id/logout_btn"
        android:title="Log Out" />
</menu>

我希望我的搜索视图表现得像那个视频中的搜索视图,点击搜索,出现键盘,你可以输入,你可以退出。我还想在进入搜索视图时让这三个垂直点图标消失。

首先声明一个状态变量以确定何时需要隐藏菜单项

boolean isHideMenuState = false;

然后引用需要隐藏在 onCreateOptionsMenu 块中的项目

MenuItem logoutItem = menu.findItem(R.id.logout_btn);
//... initialize other menu items here

//use hidden state to define when to hide item(s)
if(isHideMenuState){
   logoutItem.setVisible(false);
  //by now the ellipses(...) should go off
  //if not try using setShowAsAction passing (SHOW_AS_ACTION_NEVER)
 }
else{ 
   logoutItem.setVisible(true);
 }

下一步:将焦点更改侦听器添加到您的 searchView

searchView.setOnQueryTextFocusChangeListener(new View.OnFocusChangeListener() { 
  @Override
public void onFocusChange(View v, boolean hasFocus) {
    // Toggle isHideMenuState when search widget has focus/no focus 
        isHideMenuState = hasFocus  
    //Tell menu to re-create itself
    invalidateOptionsMenu(); // onCreateOptionsMenu(...) is called again
    }         
 });

最后 UI 尝试更改 searchView 项目的 actionViewClass

 app:actionViewClass="android.support.v7.widget.SearchView"

click on the search, the keyboard appears, you can type, you can exit.

为此,您需要这样做:

  • onCreateOptionsMenu 中:
    • 添加searchView.setIconifiedByDefault(false);
    • 添加
searchItem.setOnActionExpandListener(new MenuItem.OnActionExpandListener() {
    @Override
    public boolean onMenuItemActionExpand(MenuItem item) {
        searchView.setIconified(false);
        return true;
    }

    @Override
    public boolean onMenuItemActionCollapse(MenuItem item) {
        searchView.setIconified(true);
        searchView.clearFocus();
        return true;
    }
});

searchView.setIconifiedByDefault(false); 的目的是在用户按下搜索图标时默认显示 SearchView 的展开视图。 searchView.setIconified(false); 是让视图有焦点,显示软键盘。 searchView.setIconified(true); 是当您的用户退出 SearchView 时清除文本。最后,searchView.clearFocus();是隐藏软键盘。

I also want to make this 3 vertical dots icon disappear when I enter the search view.

为此,您可以这样做:

  • onMenuItemActionExpand
  • 中添加logoutItem.setVisible(false);
  • onMenuItemActionCollapse
  • 中添加logoutItem.setVisible(true);