旋转更改时切换Android导航抽屉的DrawerLockMode.

Apu*_*pta 4 android navigation-drawer drawerlayout

我正在关注这篇文章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);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在的问题是,即使在设置DrawerLayout.LOCK_MODE_LOCKED_OPEN之后,我的活动在纵向模式下开始,旋转抽屉可折叠后(可以使用从右到左的手势滑动关闭).在横向模式下直接打开时不会发生此问题.

elm*_*ngo 5

我不得不将该代码移动到我的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);
    }
}
Run Code Online (Sandbox Code Playgroud)


Col*_*ynn -1

您应该自己处理配置更改。

使用onConfigurationChanged回调方法始终了解您所处的方向。请确保android:configurationChanges="orientation"在清单中包含该标签。有关处理配置更改的快速说明,请参阅用户指南的这一部分。

我认为问题的根源在于 Android 处理生命周期方法的方式与您的预期略有不同。使用显式onConfigurationChanged方法将消除任何歧义。