应用程序图标未显示在操作栏上
Posted
技术标签:
【中文标题】应用程序图标未显示在操作栏上【英文标题】:The application icon does not show on action bar 【发布时间】:2015-01-06 10:58:51 【问题描述】:我按照构建新 android 项目的说明进行操作,得到了一个可运行的项目,但操作栏存在问题。问题是的应用程序标题旁边。我使用以下配置创建了项目:
最低要求 SDK:API 8:Android 2.2(Froyo)
目标 SDK:API 21:Android 4.X(L 预览版)
编译方式:API 21:Android 4.X(L 预览版)
主题:Holo Light with Dark Action Bar(Eclipse设置对应appcompat主题)
Android 支持库 21.0.1
Android SDK 构建工具 21.1.1
因为我的最小 sdk 是不支持操作栏的 api 8,所以该项目包含一个appcompat_v7 library
以允许操作栏功能。如果我将最小 sdk 设置为 api 14(android 4.0) 或更高版本,则项目不包含 appcompat_v7 library
并且应用程序图标也成功显示。但是我需要我的应用程序支持低至 api 8 的旧 android 操作系统。那么我应该怎么做才能解决这个问题呢?真的很感谢你们的关注。
P.S:我在 windows、mac、eclipse、android studio 上完成了上面的任务,得到了相同的结果。
【问题讨论】:
@Andrew Barber,我的问题很清楚,我给出了重现它的配置。它是一个空白的 android 项目,具有我上面列出的配置,不涉及单行代码,也不需要调试帮助,因为根本没有错误。它只是应用程序图标在应该在的操作栏上丢失。你为什么要结束这个问题?这怎么可能不够清楚? 我仍然认为它需要更多信息,但是关于您添加的信息(您应该添加到问题中 - 这也会“碰撞”它),我会继续重新打开。 API21 是 android 5,而不是 4.x。还有哪个版本的 appcompat ?您使用的是 Holo 主题还是 appcompat 主题?发布更多详细信息。 @Gabriele Mariotti,API 21 确实是 android 5.0。但是 eclipse ADT 插件只为我提供“API 21:Android 4.X(L preview)”供我选择,这也让我感到困惑。我使用最新的 appcompat-v7(Android 支持库 21.0.1)和其中的 appcompat 主题,两者都被 eclipse 自动包含并配置到项目中。 @Gabriele Mariotti,我尝试在 windows、mac、eclipse、android studio 上做同样的事情并得到了同样的结果。你能用我的配置创建一个新的android项目来看看这个问题是否也会发生? 【参考方案1】:您使用的是AppCompat
21+版本,正常。
操作栏遵循材料设计指南并使用Toolbar。 如您所见here:
使用应用程序图标加标题作为标准布局是 不鼓励在 API 21 和更新的设备上使用。
如果你想要一个应用程序图标(但我不鼓励),你可以使用方法setLogo()
。
类似这样的:
ActionBar actionBar = getSupportActionBar();
actionBar.setLogo(R.drawable.my_logo);
actionBar.setDisplayUseLogoEnabled(true);
actionBar.setDisplayShowHomeEnabled(true);
【讨论】:
我试过 setLogo 但还是不行。这是我的代码:@Override protected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ActionBar ab =getSupportActionBar(); ab.setLogo(R.drawable.ic_launcher);
如果我将最小 sdk 设置为 api 14(android 4.0) 或更高版本,则不会包含 appcompat 并且应用程序图标会成功显示而无需任何相应的代码(如 setLogo)。
如果没有appcompat,您使用的是标准ActionBar(带有Holo Thme),所以这是正常的。
但是为什么 setLogo() 方法不适用于 appcompat?这可能是 AppCompat 21 的错误吗?
这是另一个被这个问题困扰的人。[antonioleiva.com/material-design-everywhere/] (max2817) 但现在至少我知道它是正常的,并由你的回答推荐。也许等更多人加入棒棒糖之后,我才能找到最终的答案。【参考方案2】:
当您使用修订版 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
【讨论】:
谢谢。一个问题,它是否向后/向前兼容?【参考方案3】:确保您在 manifest.xml 文件中设置了图标,在应用程序标记中为:
android:icon="@drawable/launcher_icon"
然后在 onCreate 方法中插入以下行:
ActionBar ab =getSupportActionBar();
ab.setDisplayShowHomeEnabled(true);
ab.setIcon(R.drawable.launcher_icon);
【讨论】:
为什么要在两个地方定义??【参考方案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 = getActionBar();
最后:
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);
【讨论】:
这对我有用。谢谢。确实应该有一种更简单的方法来保留应用的样式元素。【参考方案5】:属性标识只用于API 11及更高级别(当前最低为8),我也对这个问题感到困惑,也许谷歌只是不希望图标显示在材料设计上,当设置了最小sdk 14岁以上21岁以下,使用holo主题,有图标,但appcompat风格我觉得更像material design,可能google只是忘了修改holo主题
【讨论】:
是的,他们默认隐藏图标没问题,但至少他们应该为我们提供一种手动显示它的方法。【参考方案6】: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);
【讨论】:
以上是关于应用程序图标未显示在操作栏上的主要内容,如果未能解决你的问题,请参考以下文章
当应用程序未在 Android 上运行时,使用 React Native 在状态栏上显示通知图标
任务栏上没有显示Telerik RadWindow图标c#wpf [复制]
quickType 栏上的自动填充密码键盘键锁图标未显示 - iOS? - 已设置 textContentType = .password?