在 Android 导航抽屉旋转更改时切换抽屉锁定模式。

5

我正在遵循这篇文章 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个回答

6

我不得不将那段代码移动到我的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);
    }
}

1
这解决了我之前遇到的类似问题,尽管代码被调用了。将它移到onResume中使得锁定/解锁操作正常工作。如果有人知道为什么会这样,请告诉我。 - Ben987654

-1

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

使用onConfigurationChanged回调方法始终知道你处于哪个方向。确保在清单中包含android:configurationChanges="orientation"标记。请参阅用户指南的this section,了解如何快速处理配置更改。

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


在 onConfigChanges() 中,我应该重新初始化哪些值? - Apurv Gupta
在onConfigurationChanged中,检查新的方向。如果是横向的,则打开抽屉并锁定它。如果是纵向的,则将抽屉设置为关闭并解锁它,或者将其设置回用户在纵向上最后完成的操作。 - Collin Flynn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接