【问题标题】:How to hide\show SearchView from Toolbar?如何从工具栏中隐藏\显示 SearchView?
【发布时间】:2019-03-16 16:59:37
【问题描述】:

我有ToolBar 并且我已将Searchview 定义为一个项目:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    <item
        android:id="@+id/action_search"
        android:icon="@android:drawable/ic_menu_search"
        app:showAsAction="never"
        app:actionViewClass="android.support.v7.widget.SearchView"
        android:title="Search"/>
</menu>

然后我有BaseActivity 类,我在其中定义Toolbar

protected final void onCreate(Bundle savedInstanceState, int layoutId)
{
    super.onCreate(savedInstanceState);
    setContentView(layoutId);

    Toolbar myToolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(myToolbar);
    getSupportActionBar().setDisplayShowTitleEnabled(false);

    assert myToolbar != null;

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.menu, menu);

    return true;
}

我有显示工具栏的搜索活动,我想显示搜索视图。问题是 APP 因 空指针异常 而崩溃,无法找到 SearchViewaction_search

public class SearchActivity extends BaseActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_search);

        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        SearchView searchview = (SearchView) findViewById(R.id.action_search);
        searchview.setVisibility(SearchView.VISIBLE);

    }
}

显示\隐藏SearchView的正确方法是什么?

【问题讨论】:

    标签: android toolbar searchview


    【解决方案1】:

    在您的 SearchActivity 中,使用以下代码:

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.menu_main, menu);
            MenuItem menuItem = menu.findItem(R.id.action_search);
            menuItem.setVisible(false);
            return true;
        }
    

    【讨论】:

      【解决方案2】:

      (科特林)

      这是显示/隐藏搜索视图的简单方法:

          private lateinit var menuItem: MenuItem
          private var mSearchView: SearchView? = null
      
          private fun updateSearchUI(visible: Boolean) {
          if (isChecked) {
              menuItem.isVisible = true
          }else{
              menuItem.isVisible = false
          }
          }
      

      如果您想检查某些首选项并显示/隐藏,则在首次加载 Activity 时:

      override fun onCreateOptionsMenu(menu: Menu?): Boolean {
          menuInflater.inflate(R.menu.menu, menu)
          menuItem = menu!!.findItem(R.id.shortcut_search)
          mSearchView = menuItem.actionView as SearchView
          updateSearchUI(PreferenceManager.getVisibilityStatus(applicationContext))
          return true
      }
      

      如果你想切换 searchView 显示/隐藏:

      switch_on_off.setOnCheckedChangeListener { buttonView, isChecked ->
          updateSearchUI(isChecked)
          }
      }
      

      【讨论】:

        【解决方案3】:

        请注意onCreate 是第一个被调用的活动生命周期方法。 onCreateOptionsMenu 在(取决于您的 Android 版本)期间或 onCreate 之后触发。考虑到这一点,当您在 onCreate 方法中使用 findViewById(R.id.action_search) 时,它将产生一个 NULL 对象,因此会出现错误。

        请查看here 了解其他开发人员的其他意见。

        显示\隐藏 SearchView 的正确方法是什么?

        您不必手动显示/隐藏它。在您的菜单资源中,您已经包含了选项android:showAsAction="never"。它means:

        切勿将此项目放在应用栏中。而是在应用栏的溢出菜单中列出该项目。

        默认情况下,您的搜索视图项已隐藏。要显示它,您需要单击工具栏上的溢出菜单(三个点)。

        【讨论】:

        • 感谢您的回答。问题是我想在某些活动的工具栏上显示 SearchView 而在其他活动上隐藏。这就是为什么我想像 android:showAsAction="never" 这样默认隐藏它并在某些 Activity 上激活。
        • 首先,您需要将您的searchview.setVisibility(SearchView.VISIBLE);(您可能不需要它)移出onCreate 方法。
        【解决方案4】:

        试试下面:

        首先:将“app:showAsAction”属性改为“always”

        <menu xmlns:android="http://schemas.android.com/apk/res/android"
            <item
                android:id="@+id/action_search"
                android:icon="@android:drawable/ic_menu_search"
                app:showAsAction="always"
                app:actionViewClass="android.support.v7.widget.SearchView"
                android:title="Search"/>
        </menu>
        

        第二:不能在onCreate中直接访问SearchView。所以删除下面的代码。

                SearchView searchview = (SearchView) findViewById(R.id.action_search);
                searchview.setVisibility(SearchView.VISIBLE);
        

        第三:当 SearchView 添加到工具栏时,即调用 onCreateOptionsMenu 时,您可以访问它。

                @Override
                public boolean onCreateOptionsMenu(Menu menu) {
                    MenuInflater inflater = getMenuInflater();
                    inflater.inflate(R.menu.menu, menu);
        
                    MenuItem mSearch = menu.findItem(R.id.action_search);
                    mSearchView = (SearchView) mSearch.getActionView();//Store the reference in global variable of Base activity.
                    //Do you customization here, like
                    mSearchView.setOnQueryTextListener(this);
                    return true;
            }
        

        第四:现在你有了对 SearchView 的引用。因此您可以显示/隐藏搜索视图,如下所示:

               if(mSearchView.isShown()) {
                    mSearchView.setVisibility(View.GONE);
                } else {
                    mSearchView.setVisibility(View.VISIBLE);
                }
        

        【讨论】: