如何在菜单上保存所选单选按钮的实例状态
How to save instance state of selected radiobutton on menu
我的工具栏中有带有单选按钮项的选项菜单:
<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>
我想在 onSaveInstanceState、onRestoreInstanceState 中发生方向更改时恢复选定的单选按钮,但我不明白如何从选项菜单中的单选组中获取选定的按钮。
MenuItem
在onOptionsItemSelected
里面有item.isChecked()
方法,直接用就行了。您可以存储一个布尔字段(在我看来这不是一件坏事)并在 radiog 组发生变化时更改它
然后你可以通过简单的调用获得你的id:
if(item.isChecked()) {
your_id_field = item.getItemId()
}
这是一个完整的工作和测试示例。有了这段代码,无论您旋转屏幕多少次,当前 selected 的项目都会保留。
首先,创建这些实例变量来跟踪菜单的状态,并为您将保存在捆绑包中的首选项命名:
private final static String MENU_SELECTED = "selected";
private int selected = -1;
MenuItem menuItem;
saveInstanceState()
方法应该保存当前 selected 值:
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
savedInstanceState.putInt(MENU_SELECTED, selected);
super.onSaveInstanceState(savedInstanceState);
}
更新 onOptionsItemSelected()
中当前 select 的项目:
@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);
}
在onCreate()
中,加载保存的数据(如果存在):
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState != null){
selected = savedInstanceState.getInt(MENU_SELECTED);
}
}
然后重新select之前在onCreateOptionsMenu()
中select编辑的项目:
@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;
}
创建一个变量,例如:menu_selection
来存储所选菜单项的 ID。最初你可以定义 0
private int menu_selection = 0;
使用 onSaveInstanceState
和 onRestoreInstanceState
保存和恢复变量的值
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
// Save the id of radio button selected in the menu
savedInstanceState.putInt("selection", menu_selection);
super.onSaveInstanceState(savedInstanceState);
}
@Override
public void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
// Restore state members from saved instance
menu_selection = savedInstanceState.getInt("selection");
}
在onOptionsItemSelected
中,将选中的菜单项item.getItemId()
的id赋给变量
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle item selection
if (item.isChecked()) {
item.setChecked(false);
} else {
item.setChecked(true);
menu_selection = item.getItemId();
}
switch (item.getItemId()) {
case R.id.map_terrain:
//some action here
return true;
case R.id.map_normal:
//some action here
return true;
case R.id.map_hybrid:
//some action here
return true;
default:
return super.onOptionsItemSelected(item);
}
}
在onCreateOptionsMenu
中,找到用变量中的值标识的菜单项并勾选
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu_main, menu);
if (menu_selection != 0) {
MenuItem selected = (MenuItem) menu.findItem(menu_selection);
selected.setChecked(true);
}
return true;
}
我的工具栏中有带有单选按钮项的选项菜单:
<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>
我想在 onSaveInstanceState、onRestoreInstanceState 中发生方向更改时恢复选定的单选按钮,但我不明白如何从选项菜单中的单选组中获取选定的按钮。
MenuItem
在onOptionsItemSelected
里面有item.isChecked()
方法,直接用就行了。您可以存储一个布尔字段(在我看来这不是一件坏事)并在 radiog 组发生变化时更改它
然后你可以通过简单的调用获得你的id:
if(item.isChecked()) {
your_id_field = item.getItemId()
}
这是一个完整的工作和测试示例。有了这段代码,无论您旋转屏幕多少次,当前 selected 的项目都会保留。
首先,创建这些实例变量来跟踪菜单的状态,并为您将保存在捆绑包中的首选项命名:
private final static String MENU_SELECTED = "selected";
private int selected = -1;
MenuItem menuItem;
saveInstanceState()
方法应该保存当前 selected 值:
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
savedInstanceState.putInt(MENU_SELECTED, selected);
super.onSaveInstanceState(savedInstanceState);
}
更新 onOptionsItemSelected()
中当前 select 的项目:
@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);
}
在onCreate()
中,加载保存的数据(如果存在):
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState != null){
selected = savedInstanceState.getInt(MENU_SELECTED);
}
}
然后重新select之前在onCreateOptionsMenu()
中select编辑的项目:
@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;
}
创建一个变量,例如:menu_selection
来存储所选菜单项的 ID。最初你可以定义 0
private int menu_selection = 0;
使用 onSaveInstanceState
和 onRestoreInstanceState
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
// Save the id of radio button selected in the menu
savedInstanceState.putInt("selection", menu_selection);
super.onSaveInstanceState(savedInstanceState);
}
@Override
public void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
// Restore state members from saved instance
menu_selection = savedInstanceState.getInt("selection");
}
在onOptionsItemSelected
中,将选中的菜单项item.getItemId()
的id赋给变量
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle item selection
if (item.isChecked()) {
item.setChecked(false);
} else {
item.setChecked(true);
menu_selection = item.getItemId();
}
switch (item.getItemId()) {
case R.id.map_terrain:
//some action here
return true;
case R.id.map_normal:
//some action here
return true;
case R.id.map_hybrid:
//some action here
return true;
default:
return super.onOptionsItemSelected(item);
}
}
在onCreateOptionsMenu
中,找到用变量中的值标识的菜单项并勾选
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu_main, menu);
if (menu_selection != 0) {
MenuItem selected = (MenuItem) menu.findItem(menu_selection);
selected.setChecked(true);
}
return true;
}