旋转后不连贯的 DrawerLayout 行为

Incoherent DrawerLayout behavior after rotation

我有一个 activity 和一个 DrawerLayout 和一个 ActionBarDrawerToggle 来处理侧边菜单。

现在,我需要此 activity 仅在平板电脑上旋转而不是在 phone 上旋转,因此我将 android:configChanges="orientation|..." 添加到我的 activity 清单中并重新实现onConfigurationChanged。在 phones 上,什么都不做,强制纵向,而在平板电脑上,新方向设置为 SCREEN_ORIENTATION_SENSOR 让设备决定 我重新加载布局 setContentView().

自从我这样做后,我的侧边菜单将不会在第一次旋转后打开。我发现 onOptionsItemSelected 仍然被称为:

public boolean onOptionsItemSelected(MenuItem item)
{
    if (item.getItemId() == android.R.id.home) {
        if (mDrawerLayout.isDrawerVisible(GravityCompat.START)) {
            mDrawerLayout.closeDrawer(GravityCompat.START);
        }
        else {
            mDrawerLayout.openDrawer(GravityCompat.START);
        }
    }
    return true;
}

但是检查抽屉是否可见的测试总是 returns 正确。

知道是什么原因造成的吗?在 onConfigurationChanged 轮换后,我是否忘记重新创建或更新某些内容?

注意:我还发现如果我不重新创建布局(使用setContentView())抽屉工作正常(但我显然失去了风景布局并以某种方式缩放纵向布局)

因此,我以某种方式找到了解决方案,方法是在每次设备旋转时重新连接 DrawerLayoutActionBarDrawerToggle,然后重新创建布局:

    setContentView(R.id.my_layout_id);
    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    mDrawerLayout.setDrawerListener(mDrawerToggle);

onConfigurationChanged 方法中。

唯一的缺点是抽屉不会在两个方向之间保持其状态(如果它被打开,它将被重新创建,因此最终会在新方向关闭)。