Переключение DrawerLockMode ящика навигации Android при изменении поворота.

Я слежу за этим сообщением 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. Эта проблема не возникает при открытии непосредственно в ландшафтном режиме.


person Apurv Gupta    schedule 23.12.2013    source источник


Ответы (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);
    }
}
person elmango    schedule 14.03.2014
comment
Это устранило аналогичную проблему, с которой я столкнулся, хотя код вызывался. Перемещение его в onResume заставило блокировку/разблокировку работать правильно. Если кто-нибудь знает, почему это так, я хотел бы знать. - person Ben987654; 08.03.2016

Вы должны сами обрабатывать изменения конфигурации.

Используйте метод обратного вызова onConfigurationChanged, чтобы всегда знать, в какой ориентации вы находитесь. Обязательно включите тег android:configurationChanges="orientation" в свой манифест. Краткое описание см. в этом разделе руководства пользователя. обработки изменений конфигурации.

Я думаю, что корень проблемы в том, что Android обрабатывает методы жизненного цикла несколько иначе, чем вы ожидаете. Использование явного метода onConfigurationChanged устранит любую двусмысленность.

person Collin Flynn    schedule 23.12.2013
comment
Какие значения следует повторно инициализировать в onConfigChanges?? - person Apurv Gupta; 24.12.2013
comment
В onConfigurationChanged проверьте новую ориентацию. Если это пейзаж, откройте ящик и заблокируйте его. Если это книжная ориентация, верните ящик в закрытое и разблокируйте его или верните все, что пользователь в последний раз делал в портретной ориентации. - person Collin Flynn; 24.12.2013