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" > 
  1. 如果您使用的是android.support.v7.app.AppCompatActivity

    公共类HomeActivity扩展AppCompatActivity {

那么你应该使用android.support.v7.app.ActionBar

  ActionBar ab = getSupportActionBar(); 
  1. 如果您使用的是android.support.v4.app.FragmentActivity

    公共类HomeActivity扩展FragmentActivity {

那么你应该使用android.app.ActionBar

  ActionBar ab = getActionBar(); 
  1. 如果您使用的是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的源代码之后,我花了好几分钟的时间去“哦,哦”。

我解决了这个变化:

  1. 改变最小的android:theme="@android:style/Theme.Holo.Light" >
  2. 添加到类extends ActionBarActivity
  3. 添加导入到类import android.support.v7.app.ActionBarActivity

我知道我对这个问题迟到了(对于Android而言是新手),但是我发现这里的信息非常有帮助,并且认为我应该添加自己努力的成果,让ActionBar能够像我一样想要的工作,以防其他人喜欢我寻求帮助。

我有一个窗口小部件是一个没有窗口标题的浮动窗口。 我使用样式主题来实现android:windowIsFloatingandroid:backgroundDimEnabledandroid: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">