向Theme.Black.NoTitleBar Android添加操作栏

向Theme.Black.NoTitleBar Android添加操作栏,android,android-layout,android-actionbar,android-theme,Android,Android Layout,Android Actionbar,Android Theme,我试图以编程方式添加动作栏,如中所示,但遇到了一个错误。我的minSdk设置为11,我的应用程序有一个布局和一个活动,活动中唯一的代码是: @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.inbox);

我试图以编程方式添加动作栏,如中所示,但遇到了一个错误。我的minSdk设置为11,我的应用程序有一个布局和一个活动,活动中唯一的代码是:

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.inbox);
    ActionBar actionBar = getActionBar();
    actionBar.show();

}
如果我去掉最后两行,我的应用程序就会运行。我知道holo主题自动包含actionbar,但我不喜欢
editText
视图。你知道为什么会这样吗。我是否应该使用
全息主题
并以不同的方式设置视图主题


再说一次,我在eclipse中没有发现任何错误。我的程序正在崩溃,因为我可以从logcat中将其解读为空指针异常。

来自您链接到的文档:

如果要在自定义活动主题中删除操作栏,请将
android:windowActionBar
style属性设置为
false
。但是,如果使用主题删除操作栏,则窗口将根本不允许该操作栏,因此以后无法添加它。调用
getActionBar()
将返回
null

由于您使用的主题没有操作栏,
getACtionBar()
返回
null
,然后您试图对该
null
调用
show()
,导致引发异常

这就解释了你所犯的错误。至于该怎么办,报告说:

从Android 3.0(API级别11)开始,当活动使用系统的全息主题(或其后代主题之一)时,操作栏将显示在活动窗口的顶部,这是默认设置。您可以通过调用
requestFeature(FEATURE\u action\u bar)
或通过使用
windowActionBar
属性在自定义主题中声明来添加操作栏

这给了你两个简单的选择,让你有一个动作栏而不使用全息主题。在您的情况下,这可能是最简单的:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getWindow().requestFeature(Window.FEATURE_ACTION_BAR); // Add this line
    setContentView(R.layout.inbox);
    ActionBar actionBar = getActionBar();
    actionBar.show();
}

更新:你也应该切换到只
主题。黑色
不带
NoTitleBar
部分,因为这会阻止ActionBar工作。

Darshan说的。。。有点

更进一步,我想看看ActionBarSherlock,结合支持库,您可以将ActionBar添加到几乎任何版本的android 2.x+上

要获得全屏/无标题栏,您可以从一个类似于的ABS主题创建自己的主题

<style name="Theme.MY.Sherlock.Fullscreen" parent="Theme.Sherlock.Light.DarkActionBar">
        <item name="android:windowFullscreen">true</item>;
 </style>
我假设你也可以对标准的动作条做同样的操作(使用全息主题作为基础),因为ABS几乎是一个重复的功能(并且大部分源代码,ABS主要是一个包装类),它甚至检测到并使用14及以上版本的本机实现(11及11之间有一些缺失的功能/修复)

你可以看一看,他好像刚刚更新到JB

--在资源文件夹中的“值”下创建一个themes.xml文件(/res/values/themes.xml)

然后把它放在那里,尝试一下上面的方法,但是当然是在setTheme中(用Theme\u My\u Holo\u全屏替换名称,不要使用getSupportActionbar()。前缀,我从不使用本机实现,但它应该工作相同

<?xml version="1.0" encoding="utf-8"?>

<resources>

    <style name="Theme.My.Holo.Fullscreen" parent="Theme.Holo">
        <item name="android:windowFullscreen">true</item>;
    </style>

</resources>

是的;

我遇到了同样的问题。我最终找到了一个合理的解决方案。我有一个min api版本8,目标api为11。我也不喜欢holo样式,所以我覆盖了如下样式:

首先,您必须创建一个“res/values-v11”文件夹。您可能已经有了一个“values”文件夹,只需在同一级别创建一个“values-v11”(无论您的目标API级别是什么…始终使用“values-v11”)

创建后,您将在每个文件夹中创建一个包含您的主题的XML文档。原始值文件夹将用于任何低于android 3.0(
<?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主题,而是使用主题.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>

假的
真的
@android:style/Widget.Holo.ActionBar
看不见的
1dp
在上面的主题中,它启用了动作栏,并设置了Holo主题,但没有设置其他元素。因此,动作栏看起来像“Holo”-但其他所有内容都与较低版本中的显示完全相同(我没有看到Holo附带的难看文本条目)

然后在清单中,如果我想显示actionbar,我只需将该活动的主题设置为
android:theme=“@style/theme.Black.OptionalActionBar”

我之所以这样做,是因为我依靠现在已弃用的硬件菜单按钮在布局上失败了。通过使用上面的主题,如果需要,我可以设置操作栏,如果是旧设备,我可以将其保留为菜单。然后,我所要做的就是在菜单创建方法上设置一个属性,以支持2.0到4.0 sea毫无疑问

无论如何,看看这是否能让你达到你需要的地方


在我看来,这比其他方法容易得多,因为你不必记得请求actionbar或用代码做任何事情。你只需在活动中设置主题…然后就可以开始了。

所以我必须将actionbar添加到主题本身中?感谢你解释错误though@EGHDK我刚刚更新了我对e的回答解释“如何处理”部分。仍然使我的应用程序崩溃。似乎仍然在logcat中获得空指针。我不知道如何更好地阅读logcat
<?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>