工具栏导航图标从未被设置

72

我正在尝试使用新的工具栏组件,并且在导航图标方面遇到了一些问题。我想实现自定义的返回导航图标:

在我的清单文件中,我将父级设置为我的活动:

<activity android:name=".CardsActivity" android:parentActivityName=".MainActivity">
    <!-- Parent activity meta-data to support API level 7+ -->
    <meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value=".MainActivity" />
</activity>

我这样声明工具栏:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context="com.example.lollitest.MainActivity" >
    
    <android.support.v7.widget.Toolbar
        android:id="@+id/my_awesome_toolbar"
        android:layout_height="wrap_content"
        android:layout_width="match_parent"
        android:minHeight="?attr/actionBarSize"
        android:layout_marginBottom="10dp"
        android:background="?attr/colorPrimary" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/my_awesome_toolbar"
        android:text="@string/hello_world" />

</RelativeLayout>

然后在我的活动中,我像这样配置工具栏:

Toolbar toolbar = (Toolbar) findViewById(R.id.my_awesome_toolbar);
toolbar.setNavigationIcon(R.drawable.ic_good);
toolbar.setTitle("Title");
toolbar.setSubtitle("Sub");
toolbar.setLogo(R.drawable.ic_launcher);
setSupportActionBar(toolbar);

这给了我:

带有返回按钮的工具栏

返回图标不是setNavigationIcon()方法设置的那个!无论我给该方法提供什么可绘制对象,导航图标始终为返回箭头。

我尝试在清单中删除父级关联,但唯一的效果是(显然)防止按钮返回。

相反,如果我想要默认的返回箭头图标并且不调用setNavigationIcon(),我就没有任何图标。

处理工具栏中导航图标(自定义和默认)的正确方式是什么?

注意:我正在Android 4.4上运行测试


我已经做了很多次,但现在不知道为什么不起作用了? - filthy_wizard
值得注意的是,不建议添加app:navigationIcon,因为“所有Android设备都提供了一个返回按钮来进行此类导航,因此您不应该在应用程序的用户界面中添加返回按钮”。https://developer.android.com/guide/navigation/navigation-custom-back - apex39
13个回答

118

目前你可以使用它,更改顺序:(看起来是一个错误)

Toolbar toolbar = (Toolbar) findViewById(R.id.my_awesome_toolbar);
setSupportActionBar(toolbar);

toolbar.setNavigationIcon(R.drawable.ic_good);
toolbar.setTitle("Title");
toolbar.setSubtitle("Sub");
toolbar.setLogo(R.drawable.ic_launcher);

1
确实,这适用于自定义图标!如果要使用默认图标,那么就没有类似于sethomebuttonenabled(true)的等效选项了,是吗? - grunk
4
getSupportedActionBar().setHomeButtonEnabled(true);翻译:使支持的操作栏启用主页按钮。 - Gabriele Mariotti
10
@GabrieleMariotti 只是进行了纠正!getSupportActionBar().setHomeButtonEnabled(true)。翻译:@GabrieleMariotti只是在纠正!getSupportActionBar().setHomeButtonEnabled(true); - shaktiman_droid
@Jabbar_Jigariyo,这对我似乎不起作用。设置主页按钮时是否存在任何特定的排序错误? - cnfw
13
没关系,我找到了解决办法。你需要在将toolbar设置为supportActionBar之后添加getSupportActionBar().setDisplayHomeAsUpEnabled(true); ,类似于设置导航图标。 - cnfw
显示剩余5条评论

25

关于导航图标,这是正确的顺序

// get the actionbar as Toolbar and set it up
Toolbar toolbar = (Toolbar) findViewById(R.id.signIn_toolbar);
setSupportActionBar(toolbar);

通知工具栏提供后退导航。这将将图标设置为默认的材料图标。

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

稍后使用自定义图标覆盖它,我的情况下是Holo返回图标

toolbar.setNavigationIcon(R.drawable.ic_chevron_left_white_36dp);

20

(对用户802421的回答)

private void setToolbar() {
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    if (toolbar != null) {
        setSupportActionBar(toolbar);
        toolbar.setNavigationIcon(R.drawable.ic_action_back);
        toolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onBackPressed();
            }
        });
    }
}

工具栏配置文件

<android.support.v7.widget.Toolbar
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="@dimen/toolbar_height"
    android:background="?attr/colorPrimaryDark" />

8
使用setNavigationIcon来更改它。不要忘记先创建ActionBarDrawerToggle!以下是我使用的示例代码:
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);


    drawer = (DrawerLayout)findViewById(R.id.drawer_layout);

    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
            this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
    drawer.setDrawerListener(toggle);

    toggle.syncState();

    toolbar.setNavigationIcon(R.drawable.ic_menu);

这对我有用 - 终于!更改标准汉堡菜单图标的任务实在太难了。我弄不清为什么在其他所有设置完成后它才起作用,然后分配图标 - 有人知道原因吗? - ZooMagic

4

我曾经也遇到过类似的问题。在经历了许多烦恼后,我发现我的ActionBarDrawerToggle正在修改图标,即使它不应该修改图标(因为我没有将工具栏的引用提供给切换组件)。因此,在我的NavigationDrawerFragment类中(处理打开和关闭),我在setUp(...)方法中设置了
mDrawerToggle.setHomeAsUpIndicator(R.drawable.app_icon);
最终解决了问题。


3

我尝试像@Gabriele Mariotti一样设置工具栏,但是标题出现了一些问题。因此,我将顺序设置为

toolbar.setTitle("Title")
setSupportActionBar(toolbar);
toolbar.setNavigationIcon(R.drawable.ic_good);

并且它可以正常工作。


3
我找到了解决方案,它非常简单:
mDrawerToggle.setDrawerIndicatorEnabled(false);

希望这能对您有所帮助。


1
请问,如何获取 mDrawerToggle 对象! - Adrian Preuss
android.support.v7.widget.Toolbar没有setDrawerIndicatorEnabled方法。 - Miguel Beltran
@AdrianPreuss 你需要自己创建它。例如:ActionBarDrawerToggle(activity, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close) - android developer

3

如果您已添加此行,则从活动中删除该行。

 @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        // Sync the toggle state after onRestoreInstanceState has occurred.
        mDrawerToggle.syncState();
    }

然后设置图标。
 getSupportActionBar().setHomeAsUpIndicator(icon);

3
我使用了下面的方法,它实际上是所有上述方法的谜团。我还发现onOptionsItemSelected从未被激活。
    mDrawerToggle.setDrawerIndicatorEnabled(false);
    getSupportActionBar().setHomeButtonEnabled(true);

    Toolbar toolbar = (Toolbar) findViewById(R.id.tool_bar);
    if (toolbar != null) {
        toolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onBackPressed();
            }
        });
    }

3
您可以在任何地方使用invalidate()方法来更改工具栏状态。 例如:
Toolbar toolbar = (Toolbar)findViewById(R.id.my_awesome_toolbar);
setSupportActionBar(toolbar);

toolbar.setNavigationIcon(R.mipmap.arrow_white);
toolbar.invalidate();       // restore toolbar

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