185

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

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

4

24 回答 24

239

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

于 2014-12-30T20:54:21.713 回答
48

如果您使用的是支持库

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
于 2015-03-21T00:01:32.077 回答
37
  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();
于 2016-01-27T03:35:35.383 回答
35

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

利用

requestWindowFeature(Window.FEATURE_ACTION_BAR);

在调用 setContentView() 方法之前。

于 2013-08-26T14:33:52.773 回答
31

我遇到了上述getActionBar()方法返回 null 的问题。getActionBar()我在设置之后调用了setContentView()它,但它仍然返回了一个null.

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

于 2011-10-18T15:56:37.507 回答
28

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" > 
于 2013-06-11T11:10:33.180 回答
19
import android.support.v7.app.AppCompatActivity;

然后

extends AppCompatActivity

然后使用

getSupportActionBar().setDisplayHomeAsUpEnabled(true);
于 2016-08-19T06:51:14.410 回答
18

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

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

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

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

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

于 2013-06-22T02:23:21.773 回答
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>我认为可以使用其中包含的任何主题。

于 2014-10-03T09:31:45.157 回答
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 中使用,例如"@android:style/Theme.Holo.Light.DarkActionBar"SDK 版本 14 之前不支持。
  • 为了让您的应用程序支持最低特定版本的 SDK,您可以在元素下添加以下<app>内容:

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

    android{
      defaultConfig{
        minSdkVersion 14
        targetSdkVersion 21
      }
    }
    
于 2015-01-31T12:09:06.547 回答
8

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

于 2013-04-08T17:27:08.573 回答
8

转到 AndroidManifest.xml 并替换

android:theme="@style/AppTheme"

by 

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

于 2016-01-29T04:48:32.023 回答
7

使用 getSupportActionBar() 而不是 getActionBar()

于 2018-03-28T05:56:12.623 回答
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 方法中调用的第一件事。

于 2015-03-21T17:51:08.010 回答
4

我遇到过同样的问题。它通过在 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">
于 2017-10-26T14:31:13.333 回答
2

自从我遇到此问题以来,我想添加一件事,如果您尝试在具有父级的 Activity 上 getActionBar() ,它将返回 null。我正在尝试重构我的 Activity 包含在 ActivityGroup 中的代码,在查看了如何在源代码中创建 ActionBar 的源代码之后,我花了好几分钟才“哦,duh”。

于 2012-02-28T16:55:02.580 回答
1

我通过以下更改解决了它:

  1. 最小的变化android:theme="@android:style/Theme.Holo.Light" >
  2. 添加到课堂extends ActionBarActivity
  3. 将导入添加到类import android.support.v7.app.ActionBarActivity
于 2015-10-29T07:37:16.653 回答
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);
于 2018-03-18T06:28:05.607 回答
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">
于 2015-02-24T11:01:18.830 回答
0

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

public class MyActivity extends ActionBarActivity
{
  . . .

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

于 2014-12-16T22:51:45.683 回答
0

我知道我在这个问题上迟到了(而且是 Android 新手),但我发现这里的信息非常有帮助,我认为我应该添加我自己努力的结果,让 ActionBar 按我的意愿工作,以防像我这样的其他人来寻求帮助。

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

进一步的研究将我带到了样式和主题 API 培训指南,这使我找到了解决方案。我发现我可以将自定义主题添加到清单文件中的各个活动中,而在我将其应用到应用程序之前。我所有的窗户现在都具有所需的外观。

于 2013-07-09T02:57:29.490 回答
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
于 2019-06-12T21:58:48.267 回答
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) 失败的问题;代码是开源的使用它!

于 2015-11-05T07:28:40.927 回答
0

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

工作得很快

于 2018-09-04T18:40:14.103 回答