我遇到了同样的问题。我最终想出了一个合理的解决方案。我有一个最小 api 版本 8,目标 api 为 11。我也不喜欢全息样式,所以我覆盖了如下样式:
首先,您必须创建一个“res/values-v11”文件夹。您可能已经有一个“values”文件夹,只需在同一级别创建一个“values-v11”(无论您的目标 API 级别是什么......远离使用“values-v11”)。
创建后,您将在每个文件夹中创建一个包含您的主题的 XML 文档。原始值文件夹将用于低于 android 3.0 (< api 11) 的任何内容。你的主题看起来像这样。
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android">
<style name="Theme.Black.OptionalActionBar" parent="@android:style/Theme.Black.NoTitleBar">
<item name="android:windowNoTitle">True</item>
<item name="android:windowActionBar">False</item>
</style>
<style name="OptionalVisibility">
<item name="android:visibility">visible</item>
</style>
</resources>
请注意,我没有使用Holo主题,而是使用Theme.Black.NoTitleBar主题作为父主题。从那里,我设置选项以隐藏低于 api 11 的窗口标题和操作栏。
然后,我在“values-v11”文件夹中创建了第二个主题文档,并将其设置如下:
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android">
<style name="Theme.Black.OptionalActionBar" parent="@android:style/Theme.Black.NoTitleBar">
<item name="android:windowNoTitle">false</item>
<item name="android:windowActionBar">true</item>
<item name="android:actionBarStyle">@android:style/Widget.Holo.ActionBar</item>
</style>
<style name="OptionalVisibility">
<item name="android:visibility">invisible</item>
<item name="android:height">1dp</item>
</style>
</resources>
在上述主题中,它启用了操作栏并将其设置为Holo主题,但保留了所有其他元素。所以操作栏看起来像“holo”-ish,但其他一切都保持在较低版本中的样子(而且我没有得到 Holo 附带的丑陋文本条目)。
然后在清单中,如果我想显示操作栏,我只需将该活动的主题设置为android:theme="@style/Theme.Black.OptionalActionBar"
我之所以这样做,是因为我依靠现已弃用的硬件菜单按钮在布局上失败了。使用上面的主题,如果需要,我可以设置操作栏,如果是旧设备,我可以将其保留为菜单。然后,我所要做的就是在我的菜单创建方法上设置一个属性以无缝支持 2.0 到 4.0。
无论如何,看看这是否能让你到达你需要的地方。
在我看来,它比其他方法容易得多,因为您不必记住请求操作栏或在代码中执行任何操作。您只需将您的主题设置为您的活动......然后就可以开始了。