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

时间:2019-03-16 16:59:38

标签: android toolbar searchview

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

我有显示工具栏的搜索活动,我想显示searchview。问题是APP崩溃并出现空指针异常,无法找到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);

    }
}

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

4 个答案:

答案 0 :(得分:0)

在您的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;
    }

答案 1 :(得分:0)

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

请检查here,以了解其他开发人员的其他意见。

  

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

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

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

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

答案 2 :(得分:0)

尝试以下方法:

首先:将“ 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 = (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);
        }

答案 3 :(得分:0)

(科特琳)

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

    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
}

如果要切换searchView显示/隐藏:

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