禁用导航抽屉,切换主页按钮/向上指示器

Cat*_*ine 46 android android-actionbar navigation-drawer

设置

我有一个活动,其contentView是a的一个实例DrawerLayout,它有一个带有抽屉指示器的导航抽屉,显示在操作栏中.该活动包含一个Fragment,让我们调用它ListFragment,其中包含一个选项列表.单击选项时,我将替换为ListFragmenta DetailFragment.

应用程序的体系结构

此时,我想显示一个"向上"导航选项而不是导航抽屉指示器.如果我通过调用禁用抽屉指示器,我可以显示"向上"图标mDrawerToggle.setDrawerIndicatorEnabled(false),但这只会删除抽屉图标 - 它不会删除功能 - 也就是说,当我点击插入符号时,导航抽屉是仍然开放.

此外,在这些子视图中,我想通过从屏幕边缘拖动来禁用抽屉的打开.我试过通过调用尝试这样做,setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED)但它似乎没有禁用此功能.

我已经尝试扩展ActionBarDrawerToggle类以防止在单击指示器时打开抽屉 - 但是,所有发生的情况是执行覆盖操作("向上"导航),但抽屉仍然打开.

我还在使用片段时实现了在Android导航抽屉图像和向上插入符之间切换的步骤.它可以显示插入符号,但是尽管覆盖了向上按钮功能,菜单仍会打开(应用程序确实会导航回来 - 它也会打开抽屉).

所以,长话短说:当我的布局根是DrawerLayout:时,有没有(最好是干净和优雅,但此时我会用hacky)方式实现这些东西:

  1. 用"向上"插入物替换抽屉指示器(暂时可以通过 mDrawerToggle.setDrawerIndicatorEnabled(false))
  2. 单击插入符号时防止抽屉打开,而是使用我自己的"向上"功能覆盖
  3. 当我从屏幕边缘拖动时,防止抽屉打开.

编辑

好吧,看起来如果我都覆盖了ActionBarDrawerToggleAND onOptionsItemSelected,当我点击插入符号时菜单没有打开.但是如果我从边缘拖动它仍然会打开.救命!

son*_*ida 34

短代码

public void setDrawerState(boolean isEnabled) {
    if ( isEnabled ) {
        mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
        drawerToggle.onDrawerStateChanged(DrawerLayout.LOCK_MODE_UNLOCKED);
        drawerToggle.setDrawerIndicatorEnabled(true);
        drawerToggle.syncState();

    }
    else {
        mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
        drawerToggle.onDrawerStateChanged(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
        drawerToggle.setDrawerIndicatorEnabled(false);
        drawerToggle.syncState();
    }
}
Run Code Online (Sandbox Code Playgroud)


Cat*_*ine 22

这只是我遇到的解决方案的一部分,但很难弄清楚这个bug,所以我为了后人的缘故离开这里.

这就是我为导航抽屉定义ListView的方法:

<ListView
    android:id="@+id/listview_drawer"
    android:layout_width="240dp"
    android:layout_height="match_parent"
    android:layout_gravity="start|bottom"
    android:background="#111"
    android:choiceMode="singleChoice"
    android:divider="@android:color/transparent"
    android:dividerHeight="0dp" />
Run Code Online (Sandbox Code Playgroud)

甚至在打电话之后 setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED)我仍然能够将抽屉滑开.

但是,更改后layout_gravity"start"这个问题似乎得到解决.

我能够在一个示例,仅限导航抽屉的应用程序中重现此问题,因此它似乎是一个可重现的问题,并非我的情况所独有.


luc*_*992 11

建立在sonida的答案上.在调用setDrawerIndicatorEnabled(false)之后,onNavigateUp仍然没有被调用.所以,我刚刚创建了一个新的onClickListener来调用它:

public void setDrawerState(boolean isEnabled) {
    if ( isEnabled ) {
        mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
        drawerToggle.setDrawerIndicatorEnabled(true);
        drawerToggle.syncState();

    }
    else {
        mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
        drawerToggle.setDrawerIndicatorEnabled(false);
        drawerToggle.setToolbarNavigationClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onSupportNavigateUp();
            }
        });
        drawerToggle.syncState();
    }
}
Run Code Online (Sandbox Code Playgroud)

我也想

drawerToggle.onDrawerStateChanged(DrawerLayout.LOCK_MODE_UNLOCKED);
Run Code Online (Sandbox Code Playgroud)

已经折旧,但没有它就可以正常工作.