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);
}
}
我正在通过按钮的 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);
}
}