使用AppCompat-v7 21在ActionBar/Toolbar中显示图标

130

我尝试了这些方法-但仍然看不到之前的图标:

getSupportActionBar().setLogo(R.drawable.ic_launcher);
getSupportActionBar().setDisplayUseLogoEnabled(true);
getSupportActionBar().setIcon(R.drawable.ic_launcher);

当我使用自定义工具栏时似乎可以工作 - 但这将强制我触及所有的布局 - 有没有更好的方法来实现呢?


1
你可以在你添加了操作栏内容的活动类中添加吗? - Harsha Vardhan
15个回答

257
getSupportActionBar().setDisplayShowHomeEnabled(true);

随着

getSupportActionBar().setIcon(R.drawable.ic_launcher);

7
请注意,根据您活动的样式,getSupportActionBar() 可能会为 null - jlhonora
2
仍然没有显示图标。我使用了 getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setIcon(R.drawable.ic_app_icon); getSupportActionBar().setTitle("标签"); - Meenaxi
13
为什么图标显示在标题栏中间?我想要将图标放到标题栏左侧。请帮忙,谢谢。 - Mohammad Rajob
1
@Meenaxi 你应该使用 setDisplayShowHomeEnabled(true); 这个对我很有用。 - arniotaki
2
请注意,设置图标并不会使其可点击。如果您正在寻找可点击的图标,则需要使用.setHomeAsUpIndicator并在onOptionsItemSelected中处理它。 - Joshua Pinter
显示剩余2条评论

32

在现代Android用户界面中,开发人员应更多地依赖于工具栏的视觉独特颜色方案,而不是他们的应用程序图标。在API 21设备及更高版本上,不鼓励使用应用程序图标加标题作为标准布局。

如果您不同意,可以尝试以下方法:

在XML中创建工具栏:

<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:background="?attr/colorPrimary" />

在您的活动中:

@Override
public void onCreate(Bundle savedInstanceState) {  
    super.onCreate(savedInstanceState);
    setContentView(R.layout.my_layout);

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

使用setLogo()方法来设置图标。 代码来源


1
我想指出目前Play Store的“设置”活动在操作栏中有应用程序图标。这在Material更新后仍然存在。 - Austyn Mahoney

17

最简单的方法是:只需添加:

app:navigationIcon="@drawable/ic_action_navigation_menu">

<android.support.v7.widget.Toolbar 标签处

其中 @drawable/ic_action_navigation_menu 是图标的名称


1
完美运作!这是在工具栏中添加导航图标的正确和最简单的方法。如果您想检查导航图标的点击,可以在onOptionsItemSelected(...)中检查android.R.id.home ID。 - Sazid

17

这个对我起作用:

    getSupportActionBar().setHomeButtonEnabled(true);
    getSupportActionBar().setDisplayShowHomeEnabled(true);
    getSupportActionBar().setDisplayUseLogoEnabled(true);
    getSupportActionBar().setLogo(R.drawable.ic_logo);
    getSupportActionBar().setDisplayShowTitleEnabled(false); //optional

以及:

    getSupportActionBar().setHomeButtonEnabled(true);
    getSupportActionBar().setDisplayShowHomeEnabled(true);
    getSupportActionBar().setIcon(R.drawable.ic_logo); //also displays wide logo
    getSupportActionBar().setDisplayShowTitleEnabled(false); //optional

有太多不必要的方法,与图标无关。 - user924

12

一种更好的设置多个选项的方式:

如果您已经设置了 DisplayOptions ,那么 setIcon / setLogo 方法才能起作用。请尝试以下方法:

actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_SHOW_TITLE);
actionBar.setIcon(R.drawable.ic_launcher);

您也可以设置显示LOGO的选项(只需添加常数 ActionBar.DISPLAY_USE_LOGO)。更多信息请参见displayOptions


6

对于Actionbar:

getActionBar().setDisplayHomeAsUpEnabled(true);
getActionBar().setHomeAsUpIndicator(R.drawable.ic_action_back);

对于工具栏:

getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_action_back);

5
ActionBar和Toolbar的两种代码没有区别,这是有意为之吗? - King King
1
对于 ActionBar 应该是:getActionBar().setDisplayHomeAsUpEnabled(true); getActionBar().setHomeAsUpIndicator(R.drawable.ic_action_back); - Darsshan
这实际上是正确的方法。仅使用 setIcon 不允许创建可点击的按钮,而使用 setHomeAsUpIndicator 并在 onOptionsItemSelected 中处理可以完美解决问题。谢谢! - Joshua Pinter

6

尝试使用以下方法:

ActionBar ab = getSupportActionBar();
ab.setHomeButtonEnabled(true);
ab.setDisplayUseLogoEnabled(true);
ab.setLogo(R.drawable.ic_launcher);

6
听起来很有前途 - 但是还没有图标 :-( - ligi

5

如果您想设置主页或返回图标(不是标志或静态图标),您可以使用以下方法:

 getSupportActionBar().setDisplayHomeAsUpEnabled(true);
 getSupportActionBar().setHomeAsUpIndicator( getResources().getDrawable(R.drawable.home) );

这是正确的答案,因为部署外观和行为。 - cutiko
只有这个才能给我正常的外观(大小、边距、标题和图标之间的偏移量),即使使用矢量启动器(.xml)也可以正常工作,例如 R.mipmap.ic_launcherR.mipmap.ic_launcher_round - user924
我将其用作标志/静态图标,因为其他解决方案看起来很丑。 - user924

4
getSupportActionBar().setDisplayShowHomeEnabled(true);
getSupportActionBar().setIcon(R.drawable.ic_launcher);

或者创建一个XML布局调用tool_bar.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:background="@color/colorPrimary"
    android:theme="@style/ThemeOverlay.AppCompat.Dark"
    android:elevation="4dp">

    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

    <ImageButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@color/colorPrimary"
        android:src="@drawable/ic_action_search"/>

    </RelativeLayout>
</android.support.v7.widget.Toolbar>

现在,在您的主活动中添加此行。
 <include
     android:id="@+id/tool_bar"
     layout="@layout/tool_bar" />

3

如果您不想使用setSupportActionBar将工具栏设置为操作栏,您可以按照以下方式在导航图标旁边(例如,如果您有一个返回按钮)添加徽标:

toolbar.setLogo();

或者在xml中。
<android.support.v7.widget.Toolbar 
    ....
    android:logo="@drawable/logo"
    app:logo="@drawable/logo"/>

即使在工具栏上设置了标题,标题仍然会显示。

例如:下面图片中的绿色勾号是标志

带有导航图标、标志和标题的工具栏


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