如何从工具栏隐藏显示搜索视图



我有 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;
}

我有搜索活动,我想显示工具栏,我想显示搜索视图。问题是应用程序正在使用 NULL指针异常崩溃它找不到SearchView Action_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 SearchView的正确方法?

在您的搜索范围中,使用以下代码:

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

(kotlin)

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

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

如果要检查一些首选项并显示/hide:

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
}

如果要切换搜索视图显示/hide:

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

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

请在此处查看其他开发人员的其他观察结果。

什么是显示 hide searchView的正确方法?

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

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

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

尝试以下:

首先:更改" app:showasaction"属性为"始终"

<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) findViewById(R.id.action_search);
        searchview.setVisibility(SearchView.VISIBLE);

第三:您可以在添加到工具栏时访问搜索视图,即当调用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;
    }

第四:现在您可以参考搜索视图。因此,您可以显示/隐藏搜索视图,如下:

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

最新更新