我正在尝试以编程方式添加操作栏,如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解密为空指针异常。
答案 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>