getActionBar()返回null
我有一个奇怪的问题。 我正在制作一个targetdk 13的应用程序。
在我的主要活动的onCreate方法中,我调用getActionBar()
来设置我的操作栏。 在Android 3.2模拟器上运行时,这样工作正常,但是在使用Android 3.0和3.1时, getActionBar()
方法返回null。
我觉得这很奇怪,我不明白为什么会这样做。 这是模拟器的错误,还是有我需要做的,为了确保我的应用程序有一个操作栏?
解决方法:我想我已经find了解决这个问题的方法。 我没有使用setContentView来设置活动的布局。 相反,我正在使用fragmentTransaction.add(android.R.id.content, mFragment, mTag)
添加一个片段的活动。 这在3.2中正常工作,但在早期的蜂窝版本中,如果不在onCreate()
方法中使用setContentView,则显然不会设置操作栏。 所以我通过在我的onCreate()
方法中使用setContentView()
方法来修复它,只是提供一个包含空FrameLayout的布局。 我仍然可以像以前一样使用fragmentTransaction.add(android.R.id.content, mFragment, mTag)
方法。
这不是最漂亮的修复,但它的工作原理。
可以使用getSupportActionBar()
而不是getActionBar()
方法。
如果您正在使用支持库
import android.support.v7.app.ActionBarActivity; public class MainActivity extends ActionBarActivity {
使用getSupportActionBar()
而不是getActionBar()
*更新:
现在不推荐使用ActionBarActivity类:
import android.support.v7.app.ActionBarActivity;
我build议使用:
import android.support.v7.app.AppCompatActivity
您必须在活动呈现其视图之前将窗口types定义为操作栏。
使用
requestWindowFeature(Window.FEATURE_ACTION_BAR);
在调用setContentView()方法之前。
我遇到了上面的问题,其中getActionBar()
方法返回null。 我在设置setContentView()
getActionBar()
之后调用了getActionBar()
,并且仍然返回null
。
我通过在最初丢失的Android Manifest文件中设置min-sdk版本解决了这个问题。 <uses-sdk android:minSdkVersion="11" />
ActionBar需要应用程序或活动的主题有一个应用程序的标题。 确保您没有将您的应用程序或活动设置为Theme.NOTITLE。
<application android:name="com.xxx.yyy" android:debuggable="false" android:icon="@drawable/icon" android:label="@string/app_name" android:theme="@style/Theme.NoTitle"> // remove this line if you have this in your code <activity android:name="com.xxx.yyy.Activity" android:configChanges="orientation|keyboardHidden|screenSize" android:theme="@style/Theme.NoTitle" // remove this line if you have in your code android:windowSoftInputMode="adjustResize|stateHidden" >
-
如果您使用的是android.support.v7.app.AppCompatActivity
公共类HomeActivity扩展AppCompatActivity {
那么你应该使用android.support.v7.app.ActionBar
ActionBar ab = getSupportActionBar();
-
如果您使用的是android.support.v4.app.FragmentActivity
公共类HomeActivity扩展FragmentActivity {
那么你应该使用android.app.ActionBar
ActionBar ab = getActionBar();
-
如果您使用的是android.support.v7.app.ActionBarActivity
公共类HomeActivity扩展ActionBarActivity {
你应该使用android.support.v7.app.ActionBar
ActionBar ab = getSupportActionBar();
这个答案很晚,但是对于任何来自Google的人来说都是有帮助的:您可能需要声明
<item name="android:windowActionBar">true</item>
在你的styles.xml
。 看来false
可以是默认的。 您还需要使用API 11或更高版本。
更多细节可以在这里的文档中find 。 具体来说,引用:
提示:如果您想要删除操作栏的自定义活动主题,请将android:windowActionBar样式属性设置为false。 但是,如果使用主题删除操作栏,则该窗口根本不允许操作栏,所以稍后您不能添加它 – 调用getActionBar()将返回null。
import android.support.v7.app.AppCompatActivity;
然后
extends AppCompatActivity
然后使用
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
我有同样的问题,其中一个解决scheme是在调用getActionBar()
之前使用setContentView()
getActionBar()
。
但是还有一件事情解决了这个问题。 我指定应用程序的主题是@android:style/Theme.Holo.Light
。
<application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@android:style/Theme.Holo.Light" > ... </application>
我认为任何有<item name="android:windowActionBar">true</item>
都可以使用。
主要原因是使用不支持ActionBar的主题:
在清单文件中,在目标活动或应用程序元素中添加以下内容(如果要统一整个应用程序的主题)
支持操作栏"Theme.AppCompat.Light"
或"Theme.Holo.Light"
的主题示例…
android:theme="@android:style/Theme.Holo.Light"
将所有样式放在styles.xml
并使用"@style/themName"
在所有地方使用它是更好的,所以前一个"@style/themName"
是
android:theme="@style/AppTheme"
和styles.xml将具有以下内容:
<style name="AppTheme" parent="Theme.AppCompat.Light">
提示:
- 有些主题不能用于旧的SDK,比如SDK版本14之前不支持
"@android:style/Theme.Holo.Light.DarkActionBar"
。 -
要允许您的应用支持最低特定版本的SDK,您可以在
<app>
元素下面添加以下内容:<uses-sdk android:minSdkVersion="14" />
-
要在AndroidStudio中指定min SDK版本,您可以使用应用程序的Gradle文件。
android{ defaultConfig{ minSdkVersion 14 targetSdkVersion 21 } }
我遇到了这个问题。 我正在检查版本号,只有当它大于或等于Honeycomb时才启用操作栏,但是它返回null。 我发现原因和根本原因是我已经在values-v11文件夹下的style.xml中禁用了Holo主题风格。
去AndroidManifest.xml并replace
机器人:主题= “@风格/ AppTheme”
by
机器人:主题= “@安卓风格/ Theme.Holo.Light.DarkActionBar”
在我的情况下,我在我的代码中没有这个工作:
@Override protected void onCreate(Bundle savedInstanceState) { context = getApplicationContext(); requestWindowFeature(Window.FEATURE_ACTION_BAR); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); }
然后我玩了代码的顺序:
@Override protected void onCreate(Bundle savedInstanceState) { requestWindowFeature(Window.FEATURE_ACTION_BAR); super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); context = getApplicationContext(); }
它的工作!
结论:requestWindowFeature应该是你在onCreate方法中调用的第一件事情。
有一件事我想添加,因为我刚刚碰到这个,如果你正在尝试getActionBar()在具有父级的Activity上,它将返回null。 我试图重构代码,我的Activity包含在一个ActivityGroup中,并且在查看源代码如何创buildActionBar的源代码之后,我花了好几分钟的时间去“哦,哦”。
我解决了这个变化:
- 改变最小的
android:theme="@android:style/Theme.Holo.Light" >
- 添加到类
extends ActionBarActivity
- 添加导入到类
import android.support.v7.app.ActionBarActivity
我知道我对这个问题迟到了(对于Android而言是新手),但是我发现这里的信息非常有帮助,并且认为我应该添加自己努力的成果,让ActionBar能够像我一样想要的工作,以防其他人喜欢我寻求帮助。
我有一个窗口小部件是一个没有窗口标题的浮动窗口。 我使用样式主题来实现android:windowIsFloating
, android:backgroundDimEnabled
和android:windowNoTitle
。 小部件工作正常,直到我想添加一个button,调用一个片段分页器与几个列表片段页面,并使用ActionBar。 它会在空指针exception的页面活动上崩溃。 我将其缩小到ActionBar为空。 继以前的人谁对这个线程的贡献的调查结果,我从清单文件中删除我的主题和ActionBar工作正常,但现在我的窗口现在更长的浮动(这是全屏),它有一个我不想要的页面标题。
进一步的研究把我带到了风格和主题API培训指南 ,这使我find了一个解决scheme。 我发现我可以将我的自定义主题添加到清单文件中的单个活动,而之前我将它应用到应用程序。 我所有的窗户现在都有了所需的外观。
尝试从ActionBarActivity扩展Activity类。 这为我解决了。 做如下的事情:
public class MyActivity extends ActionBarActivity { . . .
在我的情况下,这个类只是从Activity扩展而来。
这也可以帮助一些人。
就我而言,这是因为我没有在menu.xml中定义一个上下文
尝试这个:
<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" tools:context="com.example.android.ActionBarActivity">
而不是这个:
<menu xmlns:android="http://schemas.android.com/apk/res/android">
只需通过命令点击检查源代码的执行情况:
private void initWindowDecorActionBar() { Window window = getWindow(); // Initializing the window decor can change window feature flags. // Make sure that we have the correct set before performing the test below. window.getDecorView(); if (isChild() || !window.hasFeature(Window.FEATURE_ACTION_BAR) || mActionBar != null) { return; } mActionBar = new WindowDecorActionBar(this); mActionBar.setDefaultDisplayHomeAsUpEnabled(mEnableDefaultActionBarUp); mWindow.setDefaultIcon(mActivityInfo.getIconResource()); mWindow.setDefaultLogo(mActivityInfo.getLogoResource()); }
requestWindowFeature(Window.FEATURE_ACTION_BAR); 解决了我的问题,因为我看到requestWindowFeature(Window.FEATURE_ACTION_BAR)失败; 代码是开源的使用它!
我遇到过同样的问题。 它通过chaining在styles.xml中的应用程序主题解决
之前
<!-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
后
<!-- Base application theme. --> <style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">