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

时间:2012-07-08 01:05:18

标签: android android-layout android-actionbar android-theme

我正在尝试以编程方式添加操作栏,如dev documentaion中所示,但我遇到了错误。我的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主题会自动包含动作栏,但我不喜欢editText个视图。关于为什么会发生这种情况的任何想法。我应该使用HoloTheme并以不同方式对视图进行主题化吗?

同样,我在eclipse中没有收到任何错误。我的程序崩溃了,因为我可以从logcat解密为空指针异常。

3 个答案:

答案 0 :(得分:12)

从您链接到的文档:

  

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

由于您使用的主题没有操作栏,getACtionBar()正在返回null,然后您尝试在show()上调用null,结果在抛出异常时。

这样就解释了你得到的错误。至于该怎么做,documentation for ActionBar说:

  

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

这为您提供了两个简单的选项,可以在不使用Holo主题的情况下拥有ActionBar。在您的情况下,这可能是最简单的:

@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();
}

更新:您还应切换到Theme.Black而不使用NoTitleBar部分,因为这会阻止ActionBar正常工作。

答案 1 :(得分:10)

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

首先,您必须创建一个“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附带的丑陋文本条目)。

然后在清单中,如果我想要显示操作栏,我只需将该活动的主题设置为android:theme="@style/Theme.Black.OptionalActionBar"

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

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

在我看来,它比其他方法容易得多,因为您不必记住请求操作栏或在代码中执行任何操作。您只需在活动中设置主题......然后就离开。

答案 2 :(得分:7)

Darshan说什么......有点

为了更进一步,我会检查ActionBarSherlock,结合支持库,然后你可以添加动作栏到几乎任何版本的2.x +

要获得全屏/无标题栏,您可以从其中一个类似于

的ABS主题创建自己的主题
<style name="Theme.MY.Sherlock.Fullscreen" parent="Theme.Sherlock.Light.DarkActionBar">
        <item name="android:windowFullscreen">true</item>;
 </style>

在onCreate中应用该主题然后获取要显示的操作栏是相同的(除了您将使用ABS支持前缀)所以基本上

setTheme(R.style.Theme_MY_Sherlock_Fullscreen);
setContentView(R.layout.mylayout);
getSupportActionBar.Show();

我假设您可以对标准操作栏(使用holo主题作为基础)执行相同的操作,因为ABS几乎是一个重复的功能(而且很多来源,ABS主要是一个包装类)它甚至检测然后使用14及以上的本机实现(11和中间有一些缺少功能/修复)

您可以查看ABS here,看起来他刚刚将其更新为JB

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

然后将其放在那里并尝试上面的内容,但当然在setTheme中(用Theme_My_Holo_FullScreen替换名称并且不使用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>