java - 无法在屏幕旋转时保留菜单项
问题描述
我在其中创建了一个菜单项(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);
解决方案
首先,以除onCreate
. 如果您在这篇文章中遇到问题,请查看错误消息/问题。
其次,为了在屏幕旋转时保存东西,您可以使用onSaveInstanceState
Activity 中的 来保存微调器选择并在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);
}
}
推荐阅读
- python - 用 tweepy 回复推文
- python - 在 Python 中安装 setuptools 时没有名为“pkg_resources”的模块
- python - 用于非规范键盘输入处理的 Python 模块
- bash - 将文件名中的子字符串附加到 CSV 的每一行
- javascript - Eslint:禁用除 1 条规则之外的所有规则?
- json - 为什么 jq 1.6 不接受这个“if A then B end”语句?
- mapbox - 如何将数据附加到 Mapbox 中的数据集
- unity3d - UI 中的一个按钮,用于在 Unity 中导出控制台日志
- ms-access - 非常老的 VB3(20 多年前)在 Box Win7 32 位教授上运行,需要 DAO Access 2.0 MDB 支持
- .net - Windows 上的 .NET Core 应用程序可以捕获 SIGTERM 事件吗?