NavigationDrawer - 以编程方式创建的子菜单在屏幕旋转后消失

NavigationDrawer - programmatically created submenu disappears after screen rotate

我在旋转菜单时在导航抽屉中动态(以编程方式)创建子菜单时遇到问题。我的导航视图菜单 xml 仅包含主菜单(见下文)。调用 onCreate 事件时添加子菜单。一切正常,直到我旋转屏幕 - 子菜单中唯一显示的是它的标签。我试图调查问题并尝试使用静态变量,但没有成功。

你能告诉我我的代码有什么问题吗?

     <menu xmlns:android="http://schemas.android.com/apk/res/android">
        <group android:checkableBehavior="single" android:id="@+id/main_group">
            <item
                android:id="@+id/leagues_in_progress_item"
                android:icon="@drawable/ic_format_line_spacing_black_48dp"
                android:title="@string/title_activity_leagues_in_progress" />
            <item
                android:id="@+id/last_matches_item"
                android:icon="@drawable/ic_access_alarm_black_48dp"
                android:title="@string/title_activity_last_matches" />
            <item
                android:id="@+id/archive_item"
                android:icon="@drawable/ic_folder_open_black_48dp"
                android:title="@string/title_activity_archive" />
            <item
                android:id="@+id/put_score_item"
                android:icon="@drawable/ic_add_circle_outline_black_48dp"
                android:title="@string/title_activity_put_score" />
        </group>
    </menu>

HomeActivity.java:

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.pinokio);

    this.mDrawerLayout = (DrawerLayout) findViewById(R.id.pinokioLayout);

    // enabling action bar app icon and behaving it as toggle button
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setHomeButtonEnabled(true);

    this.mDrawerToggle = new ActionBarDrawerToggle(this, this.mDrawerLayout, R.string.app_name, R.string.app_name);
    this.mDrawerLayout.setDrawerListener(this.mDrawerToggle);

    HomeActivity.mNavigationView = (NavigationView) findViewById(R.id.left_drawer);

    this.addLeaguesSubmenu();
    HomeActivity.mNavigationView.setNavigationItemSelectedListener(
            new NavigationView.OnNavigationItemSelectedListener() {
                @Override
                public boolean onNavigationItemSelected(MenuItem menuItem) {
                    displayMenuFragment(menuItem);
                    return true;
                }
            });


    if (savedInstanceState == null) {
        this.displayMenuFragment(HomeActivity.mNavigationView.getMenu().getItem(0));
    }
}

/**
 * Add submenu that contains leagues in progress
 * @return HomeActivity
 */
private void addLeaguesSubmenu()
{
    if (this.internetConnection.isOnline()) {
        if (HomeActivity.menuLeagues == null) {
            Intent intent = this.getIntent();
            HomeActivity.menuLeagues = intent.getParcelableArrayListExtra("leagues");
        }
        this.leaguesSubmenu.generate(HomeActivity.mNavigationView, HomeActivity.menuLeagues);
    }
}

这就是生成子菜单的方法:

@Override
public void generate(NavigationView navigationView, ArrayList<League> leagues)
{
    Menu menu = navigationView.getMenu();
    SubMenu leaguesSubMenu = menu.addSubMenu(this.context.getResources().getString(R.string.title_activity_leagues_in_progress));
    League league;
    MenuItem menuItem;

    for (int i = 0; i<leagues.size(); i++) {
        league = leagues.get(i);
        menuItem = leaguesSubMenu.add(league.getShortName());

        Intent intent = new Intent();
        intent.putExtra("leagueId", league.getId());
        menuItem.setIntent(intent);

        if (!league.getFoosballMode()) {
            menuItem.setIcon(R.drawable.ic_fifa);
        }
        else {
            menuItem.setIcon(R.drawable.ic_foosball);
        }

    }
}

我认为这可能是因为旋转时视图会重新膨胀,但您的生成代码位于 onCreate 中,因此如果是这种情况,您有两种选择。您可以在视图重新膨胀时重新生成菜单,或者将其添加到 AndroidManifest.xml 文件中的 Activity:

android:configChanges="orientation|screenSize"

此外,如果您感兴趣,请参阅此处以获取有关处理配置更改(例如旋转)的信息:http://developer.android.com/guide/topics/resources/runtime-changes.html