Переключение 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 Метод устранит любую неопределенность.

Другие вопросы по тегам