无法使用 savedInstanceState 在 SearchView 上设置可见性

Can't set visibility on a SearchView with savedInstanceState

我的 activity 有一个包含 SearchView 的菜单,我正在以编程方式设置 SearchView 可见性。我正在使用 savedInstanceState 来保留可见性值,例如在旋转之间,但这方面不起作用:在 SearchView 可见性在旋转之前消失的情况下,SearchView 图标在旋转之后显示。

如果我在从 savedInstanceState 获取它的值后调试和评估 mSearchView.getVisibility(),它似乎被正确设置为 8。

我的代码中有 setVisibility(View.VISIBLE) 行,但其中 none 在设置的 savedInstanceState 值和向用户显示的旋转布局之间命中。

布局:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <!-- "Mark Favorite", should appear as action button if possible -->

    <item android:id="@+id/action_search"
        android:title="@string/action_search"
        app:actionViewClass="androidx.appcompat.widget.SearchView"
        app:showAsAction="ifRoom"/>

Activity (onSaveInstanceState):

public void onSaveInstanceState(Bundle outState){
    super.onSaveInstanceState(outState);
    switch (mSearchView.getVisibility()){
        case View.VISIBLE:
            outState.putInt("SearchViewVisibility",View.VISIBLE);
        case View.GONE:
            outState.putInt("SearchViewVisibility",View.GONE);
    };
}

Activity(菜单设置):

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.main, menu);
    //setup SearchView and callbacks
    final MenuItem searchItem = menu.findItem(R.id.action_search);
    mSearchView = (SearchView) searchItem.getActionView();

    if(mSavedInstanceState != null){
        switch (mSavedInstanceState.getInt("SearchViewVisibility")){
            case View.VISIBLE:
                mSearchView.setVisibility(View.VISIBLE);
            case View.INVISIBLE:
                mSearchView.setVisibility(View.INVISIBLE);
            case View.GONE:
                mSearchView.setVisibility(View.GONE);
        }
    }
    mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener(){
        @Override
        public boolean onQueryTextSubmit(String query) {
            SetFragmentAndFilter(query);
            return true;
        }
        @Override
        public boolean onQueryTextChange(String query) {
            // check whether this change is clearing all text from the search
            if(query.isEmpty()){
                // close the searchView
                mSearchView.post(new Runnable(){
                    @Override
                    public void run(){
                        mSearchView.clearFocus();
                    }
                });
                mSearchView.setIconified(true);
            }
            //have the list match the new query text
            SetFragmentAndFilter(query);
            return true;
        }
    });
    return true;
}

非常感谢任何想法!

您应该使用 setVisible 方法来设置菜单项的可见性。

将您的代码更改为

// Add this property
MenuItem mSearchMenuItem;

public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putBoolean("isVisible", mSearchMenuItem.isVisible());
}

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

    //setup SearchView and callbacks
    mSearchMenuItem = menu.findItem(R.id.action_search);
    if (mSavedInstanceState != null) {
        boolean isVisible = mSavedInstanceState.getBoolean("isVisible", true);
        mSearchMenuItem.setVisible(isVisible);
    }

    mSearchView = (SearchView) mSearchMenuItem.getActionView();
    mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
            return true;
        }

        @Override
        public boolean onQueryTextChange(String query) {
            // check whether this change is clearing all text from the search
            if (query.isEmpty()) {
                // close the searchView
                mSearchView.post(new Runnable() {
                    @Override
                    public void run() {
                        mSearchView.clearFocus();
                    }
                });
                mSearchView.setIconified(true);
            }
            return true;
        }
    });
    return true;
}