首页 > 解决方案 > 无法在屏幕旋转时保留菜单项

问题描述

我在其中创建了一个菜单项(Spinner).onCreateOptionsMenu并希望保留屏幕旋转的选择。我知道使用 是常见的做法SharedPreferences,但是在这种情况下,我有点困惑,因为我没有在 中创建我的视图.onCreate(),我通常会在其中加载我保存的首选项:

    @Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.action_bar_spinner, menu);
    MenuItem item = menu.findItem(R.id.spinner);
    mSpinner = (Spinner) item.getActionView();
    int selectedPosition = mPrefs.getInt(SPINNER_SELECTION, 0);
    mSpinner.setSelection(selectedPosition);
    if (isOnline()) {
        ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(getApplicationContext(), R.array.spiner_list_item_array, R.layout.custom_spinner);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        mSpinner.setAdapter(adapter);
        mSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
                mPrefsEditor.putInt(SPINNER_SELECTION, i);
                mPrefsEditor.commit();
                switch (i) {
                    case 0:
                        mBaseURL = "https://api.themoviedb.org/3/movie/popular/";
                        calltoRetrofit(mBaseURL);
                        break;
                    case 1:
                        mBaseURL = "https://api.themoviedb.org/3/movie/top_rated/";
                        calltoRetrofit(mBaseURL);
                        break;
                    case 2:
                        mIsFavoriteSelected = true;
                        mMovieURLS.clear();
                        retrieveMovies();
                        break;

                    default:
                        mBaseURL = "https://api.themoviedb.org/3/movie/popular/";
                        break;
                }


            }

            @Override
            public void onNothingSelected(AdapterView<?> adapterView) {

            }
        });
        return true;
    } else {
        return true;
    }
}

编辑:

当我尝试设置 GridLayoutManager 的方向时,我现在收到一个空指针:

 if (savedInstanceState != null){
                glm = savedInstanceState.getParcelable(SPINNER_SELECTION);
            }
            glm.setOrientation(LinearLayoutManager.VERTICAL);

标签: javaandroidsharedpreferences

解决方案


首先,以除onCreate. 如果您在这篇文章中遇到问题,请查看错误消息/问题。

其次,为了在屏幕旋转时保存东西,您可以使用onSaveInstanceStateActivity 中的 来保存微调器选择并在onCreate屏幕旋转时获取状态。例如:

private int saved_selection = -1

@Override
protected void onCreate(Bundle savedInstanceState) {
    //...

    if (savedInstanceState != null) {
        saved_selection = savedInstanceState.getInt("SPINNER_SELECTION");
    }

    //...
}

@Override
public void onSaveInstanceState(Bundle outState) {
    outState.putInt("SPINNER_SELECTION", saved_selection);

    // call superclass to save any view hierarchy
    super.onSaveInstanceState(outState);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    //...
    // set `saved_selection = i;`  in your adapter
    //...
    if( saved_selection >= 0 ) {
        mSpinner.setSelection(saved_selection);
    }
}

推荐阅读