应用程序图标没有显示在操作栏上

35

我按照创建新安卓项目的指示操作后,成功建立了一个可运行的项目,但在操作栏中存在一个问题:应用程序图标没有显示在应用程序标题旁边。以下是我创建此项目时所使用的配置:

  • 最低支持的SDK版本:API 8: Android 2.2(Froyo)

  • 目标SDK版本:API 21:Android 4.X(L preview)

  • 编译使用的SDK版本:API 21:Android 4.X(L preview)

  • 主题:Holo Light with Dark Action Bar(Eclipse为相应的appcompat主题)

  • Android Support Library 21.0.1

  • Android SDK Build-tools 21.1.1

由于我的最低SDK版本是API 8,不支持操作栏功能,因此该项目包括一个appcompat_v7库以允许操作栏功能。如果将最低SDK版本设置为API 14(Android 4.0)或更高版本,则该项目将不包括appcompat_v7库,并且应用程序图标也会成功地显示。但我需要我的应用程序支持旧版本的Android操作系统,至少低到API 8。那么我应该怎样解决这个问题呢?非常感谢大家的关注。

附注:我在Windows、Mac、Eclipse和Android Studio上都进行了上述任务,并得到了相同的结果。


@Andrew Barber,我的问题非常清楚,我提供了配置以便重现。这是一个空的Android项目,使用我上面列出的配置,没有任何代码和调试帮助,因为根本没有错误。只是应用程序图标在操作栏上丢失了,而它应该在那里。你为什么要关闭这个问题?这怎么可能不够清楚呢? - jeep
我仍然认为需要更多的信息,但是根据您提供的信息(您应该将其添加到问题中 - 这也会“推动”它),我将重新打开。 - Andrew Barber
API21 是 Android 5,而不是 4.x。另外,您使用的是哪个版本的 appcompat?您是使用 Holo 主题还是 appcompat 主题?请提供更多详细信息。 - Gabriele Mariotti
@Gabriele Mariotti,我在Windows、Mac、Eclipse和Android Studio上尝试了同样的操作,并得到了相同的结果。您能否使用我的配置创建一个新的Android项目,以查看是否也会出现此问题? - jeep
相关内容:https://dev59.com/GF8d5IYBdhLWcg3wv0cg - Gelldur
显示剩余2条评论
6个回答

60

您正在使用 AppCompat 版本 21+,这是正常的。

Action Bar 遵循Material Design指南,并使用工具栏。 如您在此处所述:

在API 21及更高版本的设备上,不鼓励使用应用程序图标加标题作为标准布局。

如果您想要一个应用程序图标(但我不建议这样做),可以使用方法setLogo()

就像这样:

ActionBar actionBar = getSupportActionBar();
actionBar.setLogo(R.drawable.my_logo);
actionBar.setDisplayUseLogoEnabled(true);
actionBar.setDisplayShowHomeEnabled(true);

7
我尝试了设置Logo,但仍然没有效果。以下是我的代码:@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ActionBar ab =getSupportActionBar(); ab.setLogo(R.drawable.ic_launcher); } - jeep
2
如果我将最小SDK设置为API 14(Android 4.0)或更高版本,则不会包括appcompat,并且应用程序图标将成功显示,无需任何相应的代码,如setLogo。 - jeep
如果你没有使用appcompat,你就会使用标准的ActionBar(具有Holo主题),所以这是正常的。 - Gabriele Mariotti
但是为什么setLogo()方法在使用AppCompat时无法工作?这可能是AppCompat 21的一个错误吗? - jeep
谢谢,现在它可以工作了,但是我怎么把徽标移到操作栏的中心? - Shridutt Kothari
显示剩余2条评论

48

当您使用修订版21的支持库时,会出现此问题。

请使用:

ActionBar actionBar = getSupportActionBar();
actionBar.setLogo(R.drawable.ic_launcher);
actionBar.setDisplayUseLogoEnabled(true);
actionBar.setDisplayShowHomeEnabled(true);

对我来说它很有效,或者你可以使用工具栏。 工具栏是应用程序布局中操作栏的一般化。 在现代Android用户界面中,开发人员应更倾向于为工具栏使用视觉上独特的配色方案,而不是使用他们的应用程序图标。 在API 21设备及更高版本上,建议不要使用应用程序图标加标题作为标准布局。

参考:https://developer.android.com/reference/android/support/v7/widget/Toolbar.html


谢谢。 一个问题,它是向后/向前兼容的吗? - Amit Tripathi

9

请确保在manifest.xml文件的application标签中设置了相应的图标,如下所示:

    android:icon="@drawable/launcher_icon"

然后在onCreate方法中插入以下几行代码:

    ActionBar ab =getSupportActionBar(); 
    ab.setDisplayShowHomeEnabled(true);
    ab.setIcon(R.drawable.launcher_icon);

为什么我们必须在两个地方定义它? - Shubham AgaRwal

4

这是一个常见的“问题”。在你抓狂之前,请确保你正在使用以下内容:

import android.support.v7.app.ActionBar; //or the v4, haven't tried with that though

而不是:

import android.app.ActionBar;

然后:

ActionBar actionBar;
actionBar = getSupportActionBar();

替换为:

actionBar = getSupportActionBar();

最后:

if (actionBar != null) {
        // enabling action bar app icon and behaving it as toggle button           
        actionBar.setDisplayHomeAsUpEnabled(true);
        actionBar.setIcon(R.drawable.your_icon);
        actionBar.setHomeButtonEnabled(true);
        actionBar.setDisplayShowHomeEnabled(true);
    }

1
这对我起作用了。谢谢。真的应该有一种更简单的方法来保留您的应用程序的样式元素。 - jwehrle

2

IN Style.xml

 <style name="MyTheme_ActionBar" parent="@style/Theme.AppCompat.Light">
   <item name="icon">@drawable/actionbar_logo</item>
  </style>

在活动中添加以下内容并尝试:

在活动中添加这个并尝试

ActionBar mActionBar = getSupportActionBar();
mActionBar.setDisplayOptions(ActionBar.DISPLAY_HOME_AS_UP |
                             ActionBar.DISPLAY_SHOW_CUSTOM |
                             ActionBar.DISPLAY_SHOW_HOME);

2

属性logo仅适用于API级别11及更高版本(当前最低级别为8),我对此问题也感到困惑,也许谷歌不希望图标显示在材料设计中,当最小SDK设置为14或更高版本且低于21时,它使用Holo主题,它有一个图标,但我认为appcompat样式更像材料设计,也许谷歌只是忘记修改Holo主题。


是的,这没问题,他们默认隐藏了图标,但至少应该提供一种手动显示的方式。 - jeep

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