4

我正在尝试以编程方式添加操作栏,如开发文档中所示,但我遇到了一个错误。我的 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();

}

如果我取出最后两行,那么我的应用程序就会运行。我知道全息主题会自动包含操作栏,但我不喜欢这些editText视图。关于为什么会发生这种情况的任何想法。我应该以HoloTheme不同的方式使用和主题化视图吗?

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

4

3 回答 3

12

从您链接到的文档中:

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

由于您使用的是没有操作栏的主题,getACtionBar()因此正在返回null,然后您尝试调用show()null,导致抛出异常。

这样就解释了您遇到的错误。至于该怎么做,ActionBar 的文档说:

从 Android 3.0(API 级别 11)开始,当 Activity 使用系统的 Holo 主题(或其后代主题之一)时,操作栏会出现在 Activity 窗口的顶部,这是默认设置。您可以通过调用或在具有属性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 工作。

于 2012-07-08T01:17:47.983 回答
10

我遇到了同样的问题。我最终想出了一个合理的解决方案。我有一个最小 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。

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

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

于 2012-08-26T22:59:01.450 回答
7

达山说什么……有点

更进一步,我会检查 ActionBarSherlock,结合支持库,您可以将操作栏添加到几乎任何 2.x+ 版本的 android

要获得全屏/无标题栏,您可以从 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();

我假设您可以对标准操作栏(使用全息主题作为基础)执行相同的操作,因为 ABS 几乎是重复的功能(而且大部分源代码,ABS 主要是一个包装器类)它甚至可以检测到然后在 14 及更高版本上使用本机实现(11 及中间有一些缺失的功能/修复)

你可以在这里看看ABS看起来他刚刚将它更新为 JB

-- 在 values 下的资源文件夹中创建一个主题.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>
于 2012-07-08T01:40:10.153 回答