Android 如何从工具栏隐藏\显示SearchView?

Android 如何从工具栏隐藏\显示SearchView?,android,toolbar,searchview,Android,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:actionV

我有
工具栏
,我将
搜索视图
定义为一个项目:

<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>
我有搜索活动,我显示工具栏,我想显示searchview。问题是,应用程序因无法找到
SearchView
action\u 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);

    }
}

显示\hide
搜索视图的正确方式是什么?

在您的搜索活动中,使用以下代码:

    @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;
    }

请注意,
onCreate
是要调用的第一个活动生命周期方法
oncreateoptions菜单
在创建期间(取决于您的Android版本)或创建之后触发。记住这一点,当您在
onCreate
方法中
findViewById(R.id.action\u search)
时,它将生成一个
NULL
对象,从而导致错误

请检查其他开发人员的其他观察结果

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

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

切勿将此项目放置在应用程序栏中。相反,在应用程序栏的溢出菜单中列出该项

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

请尝试以下操作:

第一:将“app:showAsAction”属性更改为“始终”

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

        @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);
        }
(科特林)

以下是显示/隐藏searchview的简单方法:

    private lateinit var menuItem: MenuItem
    private var mSearchView: SearchView? = null

    private fun updateSearchUI(visible: Boolean) {
    if (isChecked) {
        menuItem.isVisible = true
    }else{
        menuItem.isVisible = false
    }
    }
如果要检查某些首选项并显示/隐藏,则在首次加载活动时:

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
}
switch_on_off.setOnCheckedChangeListener { buttonView, isChecked ->
    updateSearchUI(isChecked)
    }
}
如果要切换searchView显示/隐藏:

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
}
switch_on_off.setOnCheckedChangeListener { buttonView, isChecked ->
    updateSearchUI(isChecked)
    }
}

谢谢你的回答。问题是,我想在某些活动的工具栏上显示SearchView,而在其他活动上隐藏SearchView。这就是为什么我想在默认情况下像android:showAsAction=“never”一样隐藏它,并在某些活动中激活它。首先,你需要移动你的
searchview.setVisibility(searchview.VISIBLE)onCreate
方法编写>(您可能不需要它)。
switch_on_off.setOnCheckedChangeListener { buttonView, isChecked ->
    updateSearchUI(isChecked)
    }
}