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

EGH*_*HDK 4 android android-layout android-theme android-actionbar

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

}
Run Code Online (Sandbox Code Playgroud)

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

再一次,我没有在eclipse中得到任何错误.我的程序崩溃了,我可以从logcat解密为空指针异常.

Dar*_*tle 12

从您链接到的文档:

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

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

这样就解释了你得到的错误.至于如何处理,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();
}
Run Code Online (Sandbox Code Playgroud)

更新:您也应该切换到Theme.Black没有该NoTitleBar部分,因为这会阻止ActionBar工作.


Mic*_*ner 10

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

首先,您必须创建一个"res/values-v11"文件夹.您可能已经有了一个"值"文件夹,只需在同一级别创建"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>
Run Code Online (Sandbox Code Playgroud)

请注意,我不使用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>
Run Code Online (Sandbox Code Playgroud)

在上面的主题中,它启用了操作栏并使用Holo主题进行设置,但仅保留所有其他元素.所以动作栏看起来是"全息" - 但是其他一切都保持与低版本中出现的完全相同(而且我没有得到Holo附带的丑陋文本条目).

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

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

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

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


Idi*_*tic 7

Darshan说的......有点儿

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

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

<style name="Theme.MY.Sherlock.Fullscreen" parent="Theme.Sherlock.Light.DarkActionBar">
        <item name="android:windowFullscreen">true</item>;
 </style>
Run Code Online (Sandbox Code Playgroud)

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

setTheme(R.style.Theme_MY_Sherlock_Fullscreen);
setContentView(R.layout.mylayout);
getSupportActionBar.Show();
Run Code Online (Sandbox Code Playgroud)

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

你可以在这看看ABS,看起来他刚刚将它更新为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>
Run Code Online (Sandbox Code Playgroud)