Android:如何将ActionBar“Home”图标更改为与应用程序图标不同的图标?

115

我的应用程序主图标由一个图标和它下面的几个字母组成。这对于应用程序的启动器图标非常好,但是当图标出现在ActionBar的左边缘时,字母会被切断,看起来不好看。

我想为ActionBar提供一个单独的版本的图标,只包含“logo”部分而没有下面的字母,但到目前为止我一无所获。老实说,我找不到任何答案,甚至找不到这个问题本身。

8个回答

219

如果在 manifest 文件中提供了 android:logo 属性,则 ActionBar 将使用它。这使您可以为图标(启动器)和徽标(ActionBar 等)使用不同的 drawable 资源。


2
是的。您还可以使用自定义样式来为操作栏提供徽标或图标,以代替清单中提供的那些。 - adamp
@Joe,有没有使用AppCompat解决API<11的方案? - cafebabe1991

49

在 AndroidManifest.xml 文件中:

<application
    android:icon="@drawable/launcher"
    android:label="@string/app_name"
    android:name="com..."
    android:theme="@style/Theme">...</Application>

在 styles.xml 中:(参见 android:icon

<style name="Theme" parent="@android:style/Theme.Holo.Light">
    <item name="android:actionBarStyle">@style/ActionBar</item>
</style>
<style name="ActionBar" parent="@android:style/Widget.Holo.Light.ActionBar">
    <item name="android:icon">@drawable/icon</item>
</style>

抱歉打扰了正在愈合的伤口 :-) 但是这里建议的样式更改解决方案仅适用于操作栏中的自定义图标,而在清单中定义android:logo可能会影响其他区域。 - dbm
@dbm,您能否举个“其他领域”的例子? - AlikElzin-kilaka
2
是的,我很好奇,开始在谷歌上搜索,这就是Android开发者网站上的内容:http://developer.android.com/guide/topics/manifest/application-element.html#logo。但我不清楚这与`andorid:icon`属性有何不同:http://developer.android.com/guide/topics/manifest/application-element.html#icon。 - dbm
2
“Action Bar doc” 还说您可以将 android:icon 添加到 <activity> 元素中,这样您就可以轻松地为不同的活动更改它。我尝试了一下,效果很好。无需使用自定义主题或担心影响所有活动。 - Jason
@kilaka 我认为不同之处在于 android:logo 与支持库(AppCompat)不兼容。 - fikr4n
显示剩余2条评论

20
请尝试这行代码。
getSupportActionBar().setHomeAsUpIndicator(R.drawable.back_arrow);

1
注意:setHomeAsUpIndicator 是 Android API 18+ 的功能。 - Joshua Pinter

8

受 TheIT 的启发,我通过操纵清单文件以稍微不同的方式使其工作。在应用程序设置中设置图标,以便大多数活动都获得图标。在您希望显示徽标的活动中,将android:logo属性添加到活动声明中。在下面的示例中,只有LogoActivity应该有徽标,而其他活动将默认使用图标。

<application
    android:name="com.your.app"
    android:icon="@drawable/your_icon"
    android:label="@string/app_name">

    <activity
        android:name="com.your.app.LogoActivity"
        android:logo="@drawable/your_logo"
        android:label="Logo Activity" >

    <activity
        android:name="com.your.app.IconActivity1"
        android:label="Icon Activity 1" >

    <activity
        android:name="com.your.app.IconActivity2"
        android:label="Icon Activity 2" >

</application>

希望这能帮助其他人!

我正在使用AppCompat v7,因为我想支持android 2.3,但是你的方法不起作用。 - liam xu

8

如果您正在使用AppCompat,那么在运行Gingerbread(API 10)或更早版本的设备上设置ActionBar图标的唯一方法是在清单文件中的每个Activity中设置android:icon属性或通过编程方式设置drawable。

<manifest>
    <application>
        ...
        <activity android:name="com.your.ActivityName"
            ...
            android:icon="@drawable/ab_logo"/>
        ...
   </application>
</manifest>

更新:请注意,如果您在启动Activity上设置android:icon属性,则应用程序图标将被覆盖。我知道的唯一解决方法是有一个启动或虚拟Activity,然后再启动您的主要Activity。

不行啊!你试过了吗?请找一个解决方案,我需要它。 - Apurva

6

请尝试使用“extends AppCompatActivity”并显示操作栏。

 ActionBar eksinbar=getSupportActionBar();
if (eksinbar != null) {
    eksinbar.setDisplayHomeAsUpEnabled(true);
    eksinbar.setHomeAsUpIndicator(R.mipmap.imagexxx);
}

4

创建标志

在文件夹 "drawable-..." 中创建所有的logo.png。 文件夹的位置: [你的应用]\app\src\main\res

在AndroidManifest.xml中添加一行:android:logo="@drawable/logo"

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:logo="@drawable/logo"
    ...

这就是全部内容了。

0

谢谢您提供的链接,我可能会移除图标上的字母,并在整个应用程序中使用相同的“徽标”图标,但我可能仍需要在操作栏上使用其较小版本或稍微不同的版本,这就是我想要弄清楚的事情。 - Phil Ringsmuth

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