getActionBar()返回null


178

我有一个奇怪的问题。我正在使用targetsdk 13开发一个应用程序。

在我的主要活动的onCreate方法中,我调用getActionBar()来设置我的操作栏。在Android 3.2模拟器上运行时,此方法工作正常,但在使用Android 3.0和3.1时,该getActionBar()方法返回null。

我觉得这很奇怪,而且我看不出任何理由这样做。这是模拟器的错误,还是我需要做一些事情,以确保我的应用程序具有操作栏?

解决方案: 我想我已经找到了解决该问题的方法。我没有使用setContentView设置活动的布局。相反,我fragmentTransaction.add(android.R.id.content, mFragment, mTag)用来向活动添加片段。在3.2中可以正常使用,但是在早期的蜂窝版本中,如果您未在onCreate()方法中使用setContentView,则显然不会设置操作栏。因此,我通过在setContentView()方法中使用方法来修复它,onCreate()并为其提供了包含一个空FrameLayout的布局。我仍然可以fragmentTransaction.add(android.R.id.content, mFragment, mTag)像以前一样使用该方法。

这不是最漂亮的解决方法,但是可以解决。


正如您在回答另一篇文章时指出的那样,您需要一个Holo主题。不要只在v13 res文件夹中指定全息主题?抱歉,这听起来太明显了。
PJL

不,这也是我的第一个想法,但事实并非如此。不过感谢您的回复。
Christian Skogsberg,

Answers:


230

可以使用getSupportActionBar()代替getActionBar()方法。


从这里全部中,这为我做到了!
msysmilu 2015年

17
谢谢,我使用的是“ android.support.v7.app.ActionBarActivity”,所以对我有用。
velval 2015年

1
经过2小时的搜寻!最终改成getSupportActionBar()和android.support.v7.app.ActionBarActivity可以为我解决。
FacePalm

这是解决问题的方法。
zygimantus

47

如果您正在使用支持库

import android.support.v7.app.ActionBarActivity;

public class MainActivity extends ActionBarActivity {

getSupportActionBar()代替getActionBar()

*更新:

现在不推荐使用ActionBarActivity类:

import android.support.v7.app.ActionBarActivity;

我建议使用:

import android.support.v7.app.AppCompatActivity

在内部android.support.v7.appActionBarActivity已弃用android.support.v7.app.AppCompatActivity改为使用。
A. Petrov

35

在活动呈现其视图之前,必须将窗口类型定义为操作栏。

使用

requestWindowFeature(Window.FEATURE_ACTION_BAR);

在调用setContentView()方法之前。


如果getSupportActionBar()无法正常工作,那么
它就

35
  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();

好答案,解决混乱!!
sud007 '16

31

我面对getActionBar()方法返回null的上述问题。getActionBar()设置后,我一直在呼叫setContentView(),但仍返回null

我通过在最初缺少的Android Manifest文件中设置min-sdk版本解决了该问题。 <uses-sdk android:minSdkVersion="11" />


4
这节省了我很多时间!任何在Android SDK中使用Bluetooth Chat示例应用程序的人都需要使用此修复程序。该应用程序的清单忽略了在其minSdkVersion标记中包含“ android:”命名空间,因此未注册。添加名称空间可修复错误,找不到操作栏。马虎,谷歌!
尼克

实际上,您可能只需要指定targetSdkVersion。如果使用compat库,则可以使用较低的minSdkVersion运行,但是targetSdkVersion决定了行为。
威廉

大!!这就是我想要的。
swiftBoy 2014年

<uses-sdk android:minSdkVersion =“ 11” />解决了我的问题,谢谢
Majid 2015年

27

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" > 

19
import android.support.v7.app.AppCompatActivity;

然后

extends AppCompatActivity

然后使用

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

解决了Google导航抽屉示例中的问题。
曾伟石

好的解决方案,但是对于那些将要实现它的人来说,很可能会遇到基于兼容性的错误。如果您碰巧这样做,请确保检查您的导入内容是否为android.support.v4.app.FragmentTransaction而不是android.app.FragmentTransaction和android.support.v7.app.ActionBar而不是android.app.ActionBar
Serj Ardovic

18

这个答案很晚,但对从Google来的任何人可能会有帮助:您可能需要声明

<item name="android:windowActionBar">true</item>

在你的styles.xml。似乎false可以是默认值。您还需要使用API​​ 11或更高版本。

可以在此处的文档中找到更多详细信息。具体来说,引用:

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


11

我遇到了同样的问题,解决方案之一是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>可以使用其中包含的任何主题。


谢谢,对我有用。就我而言,getActionBar()方法也返回null,我可以解决将主题样式更改为Theme.Holo.Light的问题。对于其他一些主题(例如Theme.AppCompat),ActionBar似乎未处于活动状态,因此其值为null。
harrakiss 2014年

10

这样做的主要原因是使用了不支持ActionBar的主题:

在清单文件中,在目标活动或应用程序元素中添加以下内容(如果要在整个应用程序中统一主题)

支持操作栏"Theme.AppCompat.Light""Theme.Holo.Light"...的主题示例

android:theme="@android:style/Theme.Holo.Light"

最好将所有样式都放进去并在styles.xml任何地方使用,"@style/themName"这样前一个样式将是

android:theme="@style/AppTheme"

and styles.xml将具有以下内容:

 <style name="AppTheme" parent="Theme.AppCompat.Light">

提示:

  • 有些主题无法在旧的SDK中使用,例如"@android:style/Theme.Holo.Light.DarkActionBar"在SDK版本14之前不受支持。
  • 为了允许您的应用支持最低特定版本的SDK,您可以在<app>元素下添加以下内容:

    <uses-sdk android:minSdkVersion="14" />
    
  • 要在AndroidStudio中指定最低SDK版本,您可以使用应用的Gradle文件。

    android{
      defaultConfig{
        minSdkVersion 14
        targetSdkVersion 21
      }
    }
    

但是,如果我使用Theme.Holo.Light.DarkActionBar
Sid

8

我遇到了这个问题。我正在检查版本号,并且仅当它大于或等于Honeycomb时才启用操作栏,但它返回null。我发现原因和根本原因是我在values-v11文件夹下的style.xml中禁用了Holo主题样式。


通过使用Holo主题作为AppTheme的父主题,我的问题已解决。
Bharat Dodeja'3

7

转到AndroidManifest.xml并替换

android:theme =“ @ style / AppTheme”

by 

android:theme =“ @ android:style / Theme.Holo.Light.DarkActionBar”



4

就我而言,我在代码中有此功能,但无法正常工作:

@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方法中首先调用的东西。


3

我遇到过同样的问题。通过更改styles.xml中的App主题来解决

之前

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">

<!-- Base application theme. -->
<style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">

2

自从我遇到这个问题以来,我想添加一件事,如果您尝试在具有父项的Activity上获取getActionBar(),它将返回null。我正在尝试重构活动包含在ActivityGroup中的代码,在看了如何在源代码中创建ActionBar的源代码后,我花了好几分钟才走了。


您可以为活动组发布解决方案吗?
Anthea 2012年

我记得的解决方案是我重构代码以不使用任何ActivityGroup。抱歉,我没有代码片段:(
C Nick

这实际上不是解决方案。更多评论。但是非常有用!
加藤

1

我通过以下更改来解决:

  1. 迷你节的变化 android:theme="@android:style/Theme.Holo.Light" >
  2. 加入课程 extends ActionBarActivity
  3. 将导入添加到类 import android.support.v7.app.ActionBarActivity

1

要添加其他答案:

确保在调用之前调用setActionBar()setSupportActionBar()onCreate()方法中getActionBar()

在您的activity.xml中定义一些工具栏,然后在onCreate()中定义:

Toolbar toolbar = (Toolbar) findViewById(R.id.my_toolbar);
setSupportActionBar(toolbar);
// Now you can use the get methods:
getSupportActionBar().setDisplayHomeAsUpEnabled(true);

0

我知道我在这个问题上迟到了(Android的新手),但是我发现这里的信息非常有帮助,并认为我应该添加我自己的努力的发现,以使ActionBar能够按我希望的方式工作,以防其他类似我的人来寻求帮助。

我有一个小部件,它是一个没有窗口标题的浮动窗口。我使用样式主题来实现android:windowIsFloatingandroid:backgroundDimEnabled并且android:windowNoTitle。该小部件工作正常,直到我想添加一个名为fragment pager的按钮,该按钮具有多个列表片段页面并使用ActionBar。它将在具有空指针异常的寻呼机活动上崩溃。我将其范围缩小为ActionBar为null。根据先前对此线程做出贡献的人们的发现,我从清单文件中删除了我的主题,并且ActionBar正常运行,但现在我的窗口不再浮动(它是全屏显示),并且具有我不想要的页面标题。

进一步的研究使我进入了Styles and Themes API培训指南,从而为我提供了解决方案。我发现可以将自定义主题添加到清单文件中的各个活动中,而之后再将其应用到应用程序中。现在,我所有的窗户都具有所需的外观。


0

尝试从ActionBarActivity扩展Activity类。这为我解决了。执行以下操作:

public class MyActivity extends ActionBarActivity
{
  . . .

就我而言,该类仅从Activity扩展。


0

这也可能对某些人有所帮助。

就我而言,这是因为我没有在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">

0

只需通过命令单击检查源代码的实现:

    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)失败的问题;代码是开源的!



0

就我而言,我只需要扩展AppCompatActivity而不是Activity

    supportActionBar?.setDisplayHomeAsUpEnabled(true)

完整的活动示例类:

导入android.os.Bundle导入androidx.appcompat.app.AppCompatActivity

//class LocationFound : Activity() { <-----Does not seem to work with ActionBar in recent versions
class LocationFound : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_location_found)

        supportActionBar?.setDisplayHomeAsUpEnabled(true)
    } }

在版本上

    minSdkVersion 22
    targetSdkVersion 29
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.