从ICS ActionBar切换到Lollipop工具栏后,缺少向上导航图标

13

我有一个包含多个片段的活动,使用操作栏和导航抽屉。 "home as up" 已启用。我已经实现了适当的逻辑,只有顶级片段才显示操作栏抽屉切换图标,其他片段则显示向上箭头。我通过以下方式实现了这一点:

mDrawerToggle.setDrawerIndicatorEnabled(false);
mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, mDrawerList);

现在旧的v4支持库ActionBarDrawerToggle已经被弃用。我已经切换到v7版,同时使用新的Toolbar来获得Material Design外观。之后当抽屉打开时,“上”箭头会正确显示,但是当执行上述代码时,它完全消失了。

这是支持库中的一个错误吗?还是我需要做一些不同的事情来显示“向上”箭头而不是抽屉指示器?


支持库目前非常不友好、文档不全且存在问题,我正在遇到很多问题。话虽如此,你可以尝试使用getActionBarCompat().displayHomeAsUpEnabled()或在<style name="ActionBar" parent="Widget.AppCompat.Light.ActionBar.Solid.Inverse">下使用<item name="displayOptions">useLogo|showHome|showTitle</item>。 - MLProgrammer-CiM
3个回答

18

尼古拉·德斯波托斯基(Nikola Despotoski)和安德烈·诺维科夫(Andrey Novikov)的回答/评论是完全正确的,但我想提到,在工具栏被以下代码替换后:

drawerToggle.setDrawerIndicatorEnabled(false);
drawerToggle.setHomeAsUpIndicator(getV7DrawerToggleDelegate().getThemeUpIndicator());
setSupportActionBar(toolbar);

即使您再次启用抽屉开关 drawerToggle.setDrawerIndicatorEnabled(true);,您的活动仍会收到每个 onOptionsItemsSelected 事件。因此,您需要处理这个问题。

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            if (drawerToggle.isDrawerIndicatorEnabled()) {
                return drawerToggle.onOptionsItemSelected(item);
            } else {
                onBackPressed();
                return true;
            }
        default:
            return super.onOptionsItemSelected(item);
    }
}

太完美了!非常感谢! - Srikanth Roopa
到目前为止这个程序一直运行正常,但最近必须升级支持库到v22.1.0,并且汉堡图标的更改也生效了。但是当您返回到以前要显示导航抽屉的片段时,汉堡图标会显示出来,但它仍然像向上箭头一样工作。即不能打开导航抽屉。有什么想法吗? - Ravi
@Ravi,你尝试根据返回堆栈计数设置显示了吗?(https://dev59.com/aGQm5IYBdhLWcg3w4CTA#19132453) - EpicPandaForce
1
@EpicPandaForce 是的,我在后退栈更改时使用了这个方法,但问题是图标不适当。也就是说,汉堡图标不能再打开导航抽屉了。mDrawerToggle.setDrawerIndicatorEnabled(true); - Ravi

10

您尝试过使用getV7DrawerToggleDelegate().getThemeUpIndicator()获取主题指示器并在禁用指示器后设置它吗?

因为当指示器被禁用时,ActionBarDrawerToggle会尝试设置先前的指示器。

来自ActionBarDrawerToggle源代码:

public void setDrawerIndicatorEnabled(boolean enable) {
    if (enable != mDrawerIndicatorEnabled) {
        if (enable) {
            setActionBarUpIndicator((Drawable) mSlider,
                    mDrawerLayout.isDrawerOpen(GravityCompat.START) ?
                            mCloseDrawerContentDescRes : mOpenDrawerContentDescRes);
        } else {
            setActionBarUpIndicator(mHomeAsUpIndicator, 0);
        }
        mDrawerIndicatorEnabled = enable;
    }
}

编辑:

由于ActionBarActivity被弃用,你应该使用getDrawerToggleDelegate().getThemeUpIndicator()


4
显示箭头有所帮助,但当箭头被点击时,onOptionsItemSelected 方法并未被调用。看起来问题出在更深的地方... - Andrey Novikov
3
请尝试再次更换工具栏。使用setSupportActionBar()方法。 - Nikola Despotoski
3
有所帮助,但这是我见过的最丑陋的黑客方式! - Andrey Novikov
1
也许只是使当前的“工具栏”失效也可以起作用。 - Nikola Despotoski
这个之前一直能用,但最近不得不更新支持库到v22.1.0,汉堡图标的变化是有效的,但当你回到之前想要显示导航抽屉的片段时,汉堡图标虽然显示出来了,但仍然像向上箭头一样工作,即无法打开导航抽屉。有什么想法吗? - Ravi
显示剩余2条评论

2

如果您使用AppCompatActivity,可以通过以下方式获取正确的抽屉图标和返回图标:

        if(homeUp)
    {
        getSupportActionBar().setDisplayHomeAsUpEnabled(false);
        mDrawerToggle.setDrawerIndicatorEnabled(false);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        mDrawerToggle.setToolbarNavigationClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onBackPressed();
            }
        });

    }
    else
    {
        mDrawerToggle.setDrawerIndicatorEnabled(true);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        mDrawerToggle.syncState();
    }

不需要使用 getV7DrawerToggleDelegate :D

谢谢!只有这个解决方案适用于我的AppCompat v7和片段列表。 - Alex

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