Android DrawerToggle和Up Navigation

时间:2015-08-10 14:23:51

标签: android toggle navigation-drawer toolbar

我正在Toolbar中实现带抽屉切换(带有汉堡箭头动画)的导航抽屉。直到这里一切顺利。现在,如果用户将内容切换到较低级别的片段,我想提供带有后退箭头的向上导航。事情变得棘手了。目前我的实现如下:

使用抽屉等初始化工具栏时

ActivityMain.java

setSupportActionBar(mToolbar);

    mActionBarDrawerToggle = new ActionBarDrawerToggle(
            this, mDrawerLayout, mToolbar, R.string.drawer_open, R.string.drawer_close) {

        public void onDrawerClosed(View view) {

            if(mDrawerFragment != null) {
                mDrawerFragment.onDrawerClose();
            }
        }

        public void onDrawerOpened(View drawerView) {
            mActionBarDrawerToggle.setDrawerIndicatorEnabled(true);

            if(mDrawerFragment != null) {
                mDrawerFragment.onDrawerOpen();
            }
        }
    };

    mDrawerLayout.setDrawerListener(mActionBarDrawerToggle);

    //Setze einen Custom-Clicklistener, der die Clicks auf den DrawerToggle handelt
    mToolbar.setNavigationOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.d("debug", "onclick");

            if(currentlyAttached instanceof GridViewFragment) {
                if(mDrawerLayout.isDrawerOpen(GravityCompat.START)) {
                    mDrawerLayout.closeDrawer(GravityCompat.START);
                }
                else {
                    mDrawerLayout.openDrawer(GravityCompat.START);
                }
            }
            else {
                onBackPressed();
            }
        }
    });

    getSupportActionBar().setDisplayShowTitleEnabled(false);
    mActionBarDrawerToggle.setDrawerIndicatorEnabled(true);
    mActionBarDrawerToggle.syncState();

我为工具栏设置了NavigationClicklistener以捕获点击的触发器。可以看出,如果用户位于根片段(GridviewFragment)上,我只想打开导航抽屉。在其他情况下,我想提供向上导航。功能本身(打开/关闭抽屉和返回)运行良好,但抽屉切换有时会显示错误的图标。一个例子:

  1. 启动应用程序:我希望汉堡包图标(在我的styles.xml中,我将颜色设置为白色)。这显示了。
  2. 将内容切换为低级别片段:我希望向上导航箭头(也是白色)。这也显示了,但是灰色(为什么?)。
  3. 回到根片段:我再次期待汉堡包图标(白色)。这显示了。
  4. 再次切换到较低级别的片段:我期待向上导航箭头(白色)。从现在开始,图标不​​再变化,我总是看到白色的汉堡包图标。
  5. 我不知道为什么会这样。也许有人有个主意?那真的很棒。我只是发布了一些额外的代码以便更好地理解。

    styles.xml,我将颜色设置为白色

    <style name="DrawerArrowStyle" parent="Widget.AppCompat.DrawerArrowToggle">
        <item name="spinBars">true</item>
        <item name="color">@android:color/white</item>
    </style>
    

    我有两个被调用的方法,当碎片发生变化时,我可以做一些事情来影响抽屉切换,但我不确定,这可能是最好的方法。

    private void provideBackNavigation() {
        mActionBarDrawerToggle.syncState();
    }
    
    private void provideMenuDrawerNavigation() {
        mActionBarDrawerToggle.syncState();
    }
    

    提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

我在自己的应用程序中设置了类似的功能。我使用方法ActionBarDrawerToggle.setDrawerIndicatorEnabled和[DrawerLayout.setDrawerLockMode](https://developer.android.com/reference/android/support/v4/widget/DrawerLayout.html#setDrawerLockMode(int,int))完成了这项工作。

首先,我创建了以下方法:

public void setDrawerState(boolean isEnabled) {
    if (isEnabled) {
        mDrawerToggle.setDrawerIndicatorEnabled(true);
        mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED, GravityCompat.START);
    } else {
        mDrawerToggle.setDrawerIndicatorEnabled(false);
        mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, GravityCompat.START);
    }
    mDrawerToggle.syncState();
}

此方法允许您锁定导航抽屉,从而无法打开要添加导航的片段。我将此方法放在我的Activity中并将其调用到我的片段的所有onResume中,因此根据我希望锁定/解锁抽屉的片段进行相应设置

接下来,在我的Activity中,我还有以下设置:

public boolean onOptionsItemSelected(final MenuItem item) {
    if (mDrawerLayout.getDrawerLockMode(GravityCompat.START)
            != DrawerLayout.LOCK_MODE_LOCKED_CLOSED
            && mDrawerToggle.onOptionsItemSelected(item)) {
        return true;
    }

    switch (item.getItemId()) {
        case android.R.id.home:
            onBackPressed();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

如果抽屉未锁定,则允许打开抽屉,但如果抽屉被锁定,则向上导航功能将接管。

最后,我的onBackPressed中的Activity方法被覆盖如下:

public void onBackPressed() {
    if (mDrawerLayout.isDrawerOpen(GravityCompat.START))
        mDrawerLayout.closeDrawer(GravityCompat.START);
    else
        super.onBackPressed();
}

如果导航抽屉打开,它将关闭导航抽屉,否则继续默认向上导航。

我相信这就是我所设置的一切,所以请告诉我它是否适合你。