Переключение DrawerLockMode в Android Navigation Drawer при смене поворота.
Я слежу за этим постом http://derekrwoods.com/2013/09/creating-a-static-navigation-drawer-in-android/
Я хочу, чтобы ящик открывался в ландшафтном режиме. Вот моя функция onCreate.
@Override
protected void onCreate(Bundle bundle) {
super.onCreate(bundle);
setContentView(R.layout.activity_order);
drawerList = (ListView) findViewById(R.id.left_drawer);
drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
FrameLayout frameLayout = (FrameLayout) findViewById(R.id.content_frame);
if (((ViewGroup.MarginLayoutParams) frameLayout.getLayoutParams()).leftMargin == (int) getResources()
.getDimension(R.dimen.drawer_size)) {
drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_OPEN);
drawerLayout.setScrimColor(Color.TRANSPARENT);
isDrawerLocked = true;
}
// Set the adapter for the list view
// drawerItems = getResources().getStringArray(R.array.drawerOptions);
drawerItems = DummyContent.ITEMS
.toArray(new DummyItem[DummyContent.ITEMS.size()]);
drawerList.setAdapter(new ArrayAdapter<DummyItem>(this,
android.R.layout.simple_list_item_1, drawerItems));
drawerToggle = new ActionBarDrawerToggle(this, drawerLayout,
R.drawable.ic_drawer, R.string.action_short,
R.string.action_short) {
/** Called when a drawer has settled in a completely closed state. */
public void onDrawerClosed(View view) {
getActionBar().setTitle("test");
// ((FragmentInterface) fragment).showMenuActions();
invalidateOptionsMenu();
}
/** Called when a drawer has settled in a completely open state. */
public void onDrawerOpened(View drawerView) {
getActionBar().setTitle("Select Option");
// ((FragmentInterface) fragment).hideMenuActions();
invalidateOptionsMenu();
}
};
if (!isDrawerLocked) {
drawerLayout.setDrawerListener(drawerToggle);
}
// Set the drawer toggle as the DrawerListener
DrawerItemClickListener drawerItemClickListener = new DrawerItemClickListener();
drawerList.setOnItemClickListener(drawerItemClickListener);
if (!isDrawerLocked) {
getActionBar().setDisplayHomeAsUpEnabled(true);
}
}
Теперь проблема заключается в том, что всякий раз, когда моя деятельность начинается в портретном режиме, после того, как вращающийся ящик становится складным (его можно закрыть с помощью жеста "вправо-влево") даже после установки DrawerLayout.LOCK_MODE_LOCKED_OPEN. Эта проблема не возникает при открытии непосредственно в ландшафтном режиме.
2 ответа
Мне пришлось переместить этот код в мой onResume():
@Override
public void onResume() {
super.onResume();
Display display = getWindowManager().getDefaultDisplay();
if (display.getRotation() == Surface.ROTATION_90 || display.getRotation() == Surface.ROTATION_270) {
// Landscape
isDrawerLocked = true;
mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_OPEN);
} else {
// Portrait
isDrawerLocked = false;
mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
}
}
Вы должны обрабатывать изменения конфигурации самостоятельно.
Использовать onConfigurationChanged
метод обратного вызова, чтобы всегда знать, в какой ориентации вы находитесь. Не забудьте включить android:configurationChanges="orientation"
тег в вашем манифесте. См. Этот раздел руководства пользователя для быстрого описания обработки изменений конфигурации.
Я думаю, что корень проблемы в том, что Android обрабатывает методы жизненного цикла немного иначе, чем вы ожидаете. Использование явного onConfigurationChanged
Метод устранит любую неопределенность.