【问题标题】:Missing Up navigation icon after switching from ICS ActionBar to Lollipop Toolbar从 ICS 操作栏切换到棒棒糖工具栏后缺少向上导航图标
【发布时间】:2014-10-24 13:36:40
【问题描述】:

我有一个包含许多使用操作栏和导航抽屉的片段的活动。它启用了“home as up”。我已经实现了正确的逻辑,只有顶级片段显示操作栏抽屉切换图标,其他片段显示箭头。我通过以下方式实现了这一目标:

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

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

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

【问题讨论】:

  • 支持库目前无用、无证和有问题,我遇到了很多问题。也就是说,在

标签: android android-ui android-5.0-lollipop android-actionbar-compat android-toolbar


【解决方案1】:

Nikola Despotoski 和 Andrey Novikov 的答案/cmets 是完全正确的,但我想提一下,工具栏被以下代码替换后:

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

即使您再次启用抽屉工具,您的活动也会收到每个 onOptionsItemsSelected 事件。drawToggle.setDrawerIndicatorEnabled(true); 所以你需要处理这个,我已经结束了

@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);
    }
}

【讨论】:

  • 完美!非常感谢!
  • 这一直有效,但最近必须将支持库更新到 v 22.1.0 并且汉堡图标的更改有效,但是当您回到要显示导航抽屉的上一个片段时,汉堡图标是显示,但它仍然可以正常工作。即不打开导航抽屉。有什么想法吗??
  • @Ravi 您是否尝试过根据 backstack 计数设置显示? (stackoverflow.com/a/19132453/2413303)
  • @EpicPandaForce 是的,我确实在后台更改时使用了它,问题是图标是否合适。即汉堡图标,但它不再打开导航抽屉 mDrawerToggle.setDrawerIndicatorEnabled(true);
【解决方案2】:

您是否尝试过使用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 ()

【讨论】:

  • 它有助于显示箭头,但onOptionsItemSelected 在被点击时不会被调用。似乎问题在更深的地方......
  • 再次尝试更换工具栏。使用 setSupportActionBar()
  • 这很有帮助,但这是我见过的最丑陋的黑客攻击!
  • 也许只是使当前Toolbar无效也可以。
  • 无效的当前工具栏不起作用。而且这个工具栏的东西让代码真的很丑:(
【解决方案3】:

如果你使用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 和片段列表
猜你喜欢
  • 2014-12-28
  • 2016-05-02
  • 1970-01-01
  • 2015-03-06
  • 2015-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多