【问题标题】:Toggling DrawerLockMode of Android Navigation Drawer on rotation change.在旋转更改时切换 Android Navigation Drawer 的 DrawerLockMode。
【发布时间】:2013-12-23 12:38:53
【问题描述】:

我正在关注这个帖子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 之后,旋转抽屉是可折叠的(可以使用从右向左滑动手势关闭)。在横向模式下直接打开不会出现此问题。

【问题讨论】:

    标签: android navigation-drawer drawerlayout


    【解决方案1】:

    我不得不将该代码移至我的 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);
        }
    }
    

    【讨论】:

    • 这解决了我遇到的类似问题,即使代码正在被调用。将其移入 onResume 使锁定/解锁正常工作。如果有人知道为什么会这样,我很想知道。
    【解决方案2】:

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

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

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

    【讨论】:

    • 我应该在 onConfigChanges 上重新初始化哪些值??
    • 在 onConfigurationChanged 中,检查新方向。如果是横向的,请打开抽屉并锁上。如果是纵向的,请将抽屉重新关闭并解锁,或者将其设置回用户上次在纵向时所做的任何操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-20
    • 1970-01-01
    相关资源
    最近更新 更多