GetActionBar ()返回 null

我遇到了一个奇怪的问题。 我在用 targetsdk 13做一个应用程序。

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

我觉得这非常奇怪,我看不出有什么理由会这样做。 这是模拟器的一个 bug 还是我需要做些什么来确保我的应用程序有一个操作栏?

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

虽然不是最好的解决办法,但是很有效。

168294 次浏览

我遇到了上面的问题,其中 getActionBar()方法返回 null。我调用的 getActionBar()后,设置的 setContentView()和仍然返回的 null

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

由于我刚刚遇到这个问题,所以我想补充一点,如果您试图在一个具有父元素的活动上获取 ActionBar () ,它将返回 null。我正在尝试重构包含在 ActivityGroup 中的 Activity 的代码,在查看了 ActionBar 如何在源代码中创建的源代码之后,我花了好几分钟时间才“哦,当然”。

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

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

这个回答有点晚了,但是对于任何从谷歌来的人来说都是有帮助的: 你可能需要申报

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

在你的 styles.xml。似乎 false可以是默认的。你也需要在 API 11或更高。

更多细节可以在文档 给你中找到。具体来说,引用如下:

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

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

我有一个小部件,这是一个浮动窗口没有窗口标题。我使用样式主题来实现 android:windowIsFloatingandroid:backgroundDimEnabledandroid:windowNoTitle。这个小部件工作得很好,直到我想添加一个按钮,该按钮调用具有几个列表片段页面的片段页面,并使用 ActionBar。它会因为空指针异常而在寻呼机活动上崩溃。我把范围缩小到行动条为空。根据以前那些对这个帖子有贡献的人的发现,我从清单文件中删除了我的主题,并且 ActionBar 工作得很好,但是现在我的窗口现在浮动的时间更长了(它是全屏的) ,而且它有一个我不想要的页面标题。

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

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

使用

requestWindowFeature(Window.FEATURE_ACTION_BAR);

在调用 setContentView ()方法之前。

我遇到了同样的问题,其中一个解决方案是在调用 getActionBar()之前使用 setContentView()

但是还有另外一件事情解决了这个问题。我指定了应用程序的主题为 @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>,可以使用。

尝试从 ActionBarActivity 扩展您的 Activity 类。这为我解决了这个问题:

public class MyActivity extends ActionBarActivity
{
. . .

在我的例子中,类只是从 Activity 扩展而来。

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

其主要原因是使用了不支持 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 中使用,比如在 SDK 版本14之前不支持 "@android:style/Theme.Holo.Light.DarkActionBar"
  • 为了让你的应用程序支持 SDK 的最低特定版本,你可以在 <app>元素下添加以下内容:

    <uses-sdk android:minSdkVersion="14" />
    
  • To specify min SDK version in AndroidStudio, you could by using app's Gradle file.

    android{
    defaultConfig{
    minSdkVersion 14
    targetSdkVersion 21
    }
    }
    

这也可以帮助一些人。

在我的例子中,这是因为我没有在 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">

如果您正在使用支持库

import android.support.v7.app.ActionBarActivity;


public class MainActivity extends ActionBarActivity {

使用 getSupportActionBar()代替 getActionBar()

* 更新:

活动类现在已被废弃:

import android.support.v7.app.ActionBarActivity;

我建议使用:

import android.support.v7.app.AppCompatActivity

在我的例子中,我在代码中使用了这个不起作用的代码:

@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();
}

成功了!

结论: 在 onCreate 方法中调用的第一件事应该是 requestWindowFeature。

我通过这些变化来解决:

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

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

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

  1. 如果你使用的是 V7.app. AppCompatActivity

    公共类 HomeActivity 扩展 AppCompatActivity {

那么您应该使用 V7.app. ActionBar

  ActionBar ab = getSupportActionBar();
  1. 如果您正在使用 < strong > android.support. v4.app. FragmentActivity

    Public 类 HomeActivity 扩展了 FragmentActivity {

那么你应该使用 Android.app ActionBar

    ActionBar ab = getActionBar();
  1. 如果您正在使用 < strong > android.support. v7.app. ActionBarActivity

    公共类 HomeActivity 扩展了 ActionBarActivity {

你应该使用 V7.app. ActionBar

   ActionBar ab = getSupportActionBar();

转到 AndroidManifest.xml 并替换

主题 = “@style/AppTheme”

by

安卓: 主题 = “@安卓: 样式/主题

import android.support.v7.app.AppCompatActivity;

那么

extends AppCompatActivity

那就用

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

我也遇到了同样的问题,通过在 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">

补充其他答案:

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

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

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

使用 getSupportActionBar ()而不是 getActionBar ()

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

效果很快

在我的例子中,我只需要扩展 AppCompatActivity而不是 Activity

    supportActionBar?.setDisplayHomeAsUpEnabled(true)

完整活动示例类:

进口机器人,操作系统,捆绑销售 导入 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

如果从片段调用此方法,请确保在 onActivityCreated()中调用此方法