如何在菜单上保存所选单选按钮的实例状态

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 中发生方向更改时恢复选定的单选按钮,但我不明白如何从选项菜单中的单选组中获取选定的按钮。

MenuItemonOptionsItemSelected里面有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;

使用 onSaveInstanceStateonRestoreInstanceState

保存和恢复变量的值
@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;
}