getActionBar()返回null

时间:2011-07-28 23:40:25

标签: android android-3.0-honeycomb android-actionbar

我有一个奇怪的问题。 我正在使用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)方法。

这不是最漂亮的修复,但它确实有效。

24 个答案:

答案 0 :(得分:210)

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

答案 1 :(得分:46)

如果您使用的是支持库

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

答案 2 :(得分:33)

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

使用

requestWindowFeature(Window.FEATURE_ACTION_BAR);

在调用setContentView()方法之前。

答案 3 :(得分:32)

  1. 如果您使用 android.support.v7.app.AppCompatActivity

    公共类HomeActivity扩展了AppCompatActivity {

  2. 然后你应该使用 android.support.v7.app.ActionBar

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

      公共类HomeActivity扩展了FragmentActivity {

    2. 然后你应该使用 android.app.ActionBar

          ActionBar ab = getActionBar();
      
      1. 如果您使用 android.support.v7.app.ActionBarActivity

        公共类HomeActivity扩展了ActionBarActivity {

      2. 你应该使用 android.support.v7.app.ActionBar

           ActionBar ab = getSupportActionBar();
        

答案 4 :(得分:31)

我遇到了getActionBar()方法返回null的上述问题。在设置getActionBar()之后我正在调用setContentView(),并且仍然返回null

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

答案 5 :(得分: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" > 

答案 6 :(得分:18)

这个答案很晚,但对于从谷歌来的人可能会有所帮助:您可能需要声明

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

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

更多详情可在文档here中找到。具体来说,引用:

  

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

答案 7 :(得分:18)

import android.support.v7.app.AppCompatActivity;

然后

extends AppCompatActivity

然后使用

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

答案 8 :(得分:10)

我遇到了同样的问题,其中一个解决方案是在调用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>

答案 9 :(得分:10)

主要原因是使用不支持ActionBar的主题:

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

支持操作栏"Theme.AppCompat.Light""Theme.Holo.Light" ...

的主题示例
android:theme="@android:style/Theme.Holo.Light"

最好将所有样式放在styles.xml中并使用"@style/themName"在任何地方使用它,以便前一个样式为

android:theme="@style/AppTheme"

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

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

提示:

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

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

    android{
      defaultConfig{
        minSdkVersion 14
        targetSdkVersion 21
      }
    }
    

答案 10 :(得分:8)

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

答案 11 :(得分:7)

转到AndroidManifest.xml并替换

机器人:主题=&#34; @风格/ AppTheme&#34;

by 

机器人:主题=&#34; @android:风格/ Theme.Holo.Light.DarkActionBar&#34;

答案 12 :(得分:6)

使用getSupportActionBar()而不是getActionBar()

答案 13 :(得分: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方法中调用的第一个东西。

答案 14 :(得分:3)

我有同样的问题。它通过在styles.xml中修改App主题来解决。

#!/usr/bin/env python
import os
import yaml
import ldap


with open('ldap_users.yaml', 'r') as file:
    doc = yaml.load(file)

for employeeType, inactive in doc['users'].iteritems():
    print employeeType, inactive

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

答案 15 :(得分:2)

我想添加一件事,因为我刚刚遇到这个问题,如果你想在一个有父类的Activity上尝试getActionBar(),它将返回null。我正在尝试重构我的Activity包含在ActivityGroup中的代码,在查看ActionBar如何在源代码中创建的源代码后,我花了好几分钟去“哦duh”。

答案 16 :(得分:1)

我通过这个改变来解决它:

  1. 改变minifest android:theme="@android:style/Theme.Holo.Light" >
  2. 添加到课程extends ActionBarActivity
  3. 将导入添加到课程import android.support.v7.app.ActionBarActivity

答案 17 :(得分: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)失败了;代码是开源使用它!!

答案 18 :(得分: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">

答案 19 :(得分:0)

尝试从ActionBarActivity扩展Activity类。这解决了我。做类似以下的事情:

public class MyActivity extends ActionBarActivity
{
  . . .

在我的情况下,该课程仅从活动中延伸。

答案 20 :(得分:0)

要添加其他答案:

在致电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);

答案 21 :(得分:0)

我知道我在这个问题上已经迟到了(并且刚接触Android),但我发现这里的信息非常有用,并且我认为我应该添加自己的努力的结果,让ActionBar工作,因为我想要以防其他人像我这样来寻求帮助。

我有一个小部件,它是一个没有窗口标题的浮动窗口。我使用样式主题来实现android:windowIsFloatingandroid:backgroundDimEnabledandroid:windowNoTitle。小部件工作正常,直到我想添加一个调用带有多个列表片段页面的片段分页器并使用ActionBar的按钮。它将在具有空指针异常的寻呼机活动上崩溃。我把它缩小到ActionBar为空。根据以前为这个线程做出贡献的人的发现,我从清单文件中删除了我的主题,ActionBar运行正常,但现在我的窗口现在更长时间浮动(它是全屏)并且它有一个我不想要的页面标题。

进一步的研究把我带到Styles and Themes API Training Guide,这让我找到了解决方案。我发现在将清单文件应用到应用程序之前,我可以将自定义主题添加到清单文件中的各个活动。我的所有窗户现在都有所需的外观。

答案 22 :(得分:0)

android.support.v7.app.ActionBar actionBar = getSupportActionBar();

工作很快

答案 23 :(得分: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