Les*_*ter 3 android savestate android-optionsmenu
我的工具栏中有radibutton项目的选项菜单:
<item
android:id="@+id/map_menu"
android:icon="@drawable/ic_layer"
android:orderInCategory="102"
app:showAsAction="always"
android:title="@string/action_settings">
<menu>
<group
android:id="@+id/map_types_group"
android:checkableBehavior="single" >
<item
android:id="@+id/map_terrain"
android:orderInCategory="1"
app:showAsAction="ifRoom"
android:title="@string/map_terrain"/>
<item
android:id="@+id/map_normal"
android:orderInCategory="2"
android:checked="true"
app:showAsAction="ifRoom"
android:title="@string/map_normal"/>
<item
android:id="@+id/map_hybrid"
android:orderInCategory="3"
app:showAsAction="ifRoom"
android:title="@string/map_hybrid"/>
</group>
</menu>
</item>
Run Code Online (Sandbox Code Playgroud)
我希望在onSaveInstanceState,onRestoreInstanceState中发生方向更改时恢复选定的radiobutton但我无法理解如何从选项菜单中的radiogroup中获取所选按钮.
这是一个完全工作和测试的例子.使用此代码后,无论您旋转屏幕多少次,当前所选项目都将保留.
首先,创建这些实例变量以跟踪菜单的状态,并为要在Bundle中保存的首选项命名:
private final static String MENU_SELECTED = "selected";
private int selected = -1;
MenuItem menuItem;
Run Code Online (Sandbox Code Playgroud)
该saveInstanceState()方法应保存当前选定的值:
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
savedInstanceState.putInt(MENU_SELECTED, selected);
super.onSaveInstanceState(savedInstanceState);
}
Run Code Online (Sandbox Code Playgroud)
更新当前所选项目onOptionsItemSelected():
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_settings) {
Log.d("settings", "id: " + id);
return true;
}
if (id == R.id.map_terrain){
Log.d("menuitem", "terrain id: " + id);
selected = id;
item.setChecked(true);
return true;
}
if (id == R.id.map_normal){
Log.d("menuitem", "normal id: " + id);
selected = id;
item.setChecked(true);
return true;
}
if (id == R.id.map_hybrid){
Log.d("menuitem", "hybrid id: " + id);
selected = id;
item.setChecked(true);
return true;
}
return super.onOptionsItemSelected(item);
}
Run Code Online (Sandbox Code Playgroud)
在onCreate(),加载已存储的数据(如果存在):
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState != null){
selected = savedInstanceState.getInt(MENU_SELECTED);
}
}
Run Code Online (Sandbox Code Playgroud)
然后重新选择之前选择的项目onCreateOptionsMenu():
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
if (selected == -1){
return true;
}
switch (selected){
case R.id.map_terrain:
menuItem = (MenuItem) menu.findItem(R.id.map_terrain);
menuItem.setChecked(true);
break;
case R.id.map_normal:
menuItem = (MenuItem) menu.findItem(R.id.map_normal);
menuItem.setChecked(true);
break;
case R.id.map_hybrid:
menuItem = (MenuItem) menu.findItem(R.id.map_hybrid);
menuItem.setChecked(true);
break;
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3871 次 |
| 最近记录: |