DrawerLayout 在方向改变时丢失状态

DrawerLayout loses state on orientation change

我正在通过按钮的 onClick 切换 DrawerLayout 的状态,并禁用其滑动。 这工作正常,但是当 Activity 改变它的方向时,抽屉不保持它的状态; 如果它被打开,它将被关闭。它甚至会添加 android:configChanges="keyboardHidden|orientation" .

我的代码 Activity:

private DrawerLayout drawer;
private int drawerLayoutGravity = Gravity.RIGHT;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    disableDrawer();

    View btnOpenDrawer = findViewById(R.id.btn_open_drawer);
    btnOpenDrawer.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            toggleDrawerState();
        }
    });
}

private void toggleDrawerState() {
    if (drawer.isDrawerOpen(drawerLayoutGravity)) {
        drawer.closeDrawer(drawerLayoutGravity);
    } else {
        drawer.openDrawer(drawerLayoutGravity);
    }
}

/**
 * doesn't let the user swipe to open the drawer
 */
private void disableDrawer() {
    drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
}

一个可能的解决方案是我在 Activity 的 onConfigurationChanged 上重新打开 DrawerLayout,但我需要避免在配置更改时显示 DrawerLayout 重新打开.

您正在为抽屉设置关闭锁定模式以禁用滑动。即使您已禁用 Activity 重新创建,方向更改也会在您的 View 上触发布局事件,并且 DrawerLayout 将根据锁定模式设置抽屉状态自我介绍。

每当以编程方式 open/close 抽屉时,您都需要更新锁定模式。

private void toggleDrawerState() {
    if (drawer.isDrawerOpen(drawerLayoutGravity)) {
        drawer.closeDrawer(drawerLayoutGravity);
        drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
    } else {
        drawer.openDrawer(drawerLayoutGravity);
        drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_OPEN);
    }
}