我也曾遇到同样的问题。最终,我想出了一个合理的解决方案。我的最小API版本为8,目标API版本为11。我也不喜欢Holo样式,所以我重写了样式,像这样:
首先,您必须创建一个“res/values-v11”文件夹。您可能已经有了一个“values”文件夹,只需在同一级别创建一个“values-v11”即可(无论您的目标API级别是什么...总是使用“values-v11”)。
一旦创建了这个文件夹,就可以在每个文件夹中创建一个包含您的主题的XML文档。原始的values文件夹将用于任何低于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”,但其他所有东西看起来仍然与较低版本中的相同(我没有得到Holo所带来的丑陋文本输入)。
然后,在清单中,如果我想让操作栏显示出来,我只需将该活动的主题设置为
android:theme="@style/Theme.Black.OptionalActionBar"
我之所以这样做,是因为在我的布局中,我依赖于现在已被弃用的硬件菜单按钮失败了。通过使用上面的主题,如果需要设置操作栏,则可以设置其,否则可以将其作为菜单留在旧设备上。然后,我只需要在我的菜单创建方法上设置一个属性,就可以无缝支持2.0到4.0。
无论如何,请看一看,看看这是否能让你达到需要的目的。
在我看来,这比其他方法容易得多,因为
您不必记得请求操作栏或在代码中执行任何操作。只需在您的活动上设置主题...然后就可以了。