getActionBar()返回null

Chr*_*erg 173 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中运行良好,但在早期的蜂窝版本中,如果您不在方法中使用setContentView,则操作栏显然未设置onCreate().所以我通过setContentView()在我的方法中使用方法修复它,onCreate()并为它提供包含空FrameLayout的布局.我仍然可以fragmentTransaction.add(android.R.id.content, mFragment, mTag)像以前一样使用该方法.

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

Ami*_*mir 219

可以用getSupportActionBar()而不是getActionBar()方法.

  • 谢谢,我正在使用"android.support.v7.app.ActionBarActivity",所以这对我来说. (16认同)

Jor*_*sys 46

如果您使用的是支持库

import android.support.v7.app.ActionBarActivity;

public class MainActivity extends ActionBarActivity {
Run Code Online (Sandbox Code Playgroud)

getSupportActionBar()而不是getActionBar()

*更新:

现在不推荐使用ActionBarActivity类:

import android.support.v7.app.ActionBarActivity;
Run Code Online (Sandbox Code Playgroud)

我建议使用:

import android.support.v7.app.AppCompatActivity
Run Code Online (Sandbox Code Playgroud)


kau*_*edi 35

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

使用

requestWindowFeature(Window.FEATURE_ACTION_BAR);
Run Code Online (Sandbox Code Playgroud)

在调用setContentView()方法之前.


Hit*_*ahu 33

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

    公共类HomeActivity扩展AppCompatActivity {

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

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

    公共类HomeActivity扩展FragmentActivity {

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

    ActionBar ab = getActionBar();
Run Code Online (Sandbox Code Playgroud)
  1. 如果您使用的是 android.support.v7.app.ActionBarActivity

    公共类HomeActivity扩展ActionBarActivity {

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

   ActionBar ab = getSupportActionBar();
Run Code Online (Sandbox Code Playgroud)


Raj*_*dra 31

我遇到了上面的问题,其中getActionBar()方法返回null.我打电话给getActionBar()设置后setContentView()仍然返回a null.

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

  • 这为我节省了很多时间!在Android SDK中使用蓝牙聊天示例应用程序的任何人都需要使用此修复程序.应用程序的清单忽略了在其minSdkVersion标记中包含"android:"命名空间,因此它不会注册.添加命名空间可修复错误,但未找到操作栏.马虎,谷歌! (4认同)

Him*_*ani 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" > 
Run Code Online (Sandbox Code Playgroud)


小智 19

import android.support.v7.app.AppCompatActivity;
Run Code Online (Sandbox Code Playgroud)

然后

extends AppCompatActivity
Run Code Online (Sandbox Code Playgroud)

然后用

getSupportActionBar().setDisplayHomeAsUpEnabled(true);
Run Code Online (Sandbox Code Playgroud)


SK9*_*SK9 18

这个答案很晚,但可能对从谷歌来的任何人都有所帮助:你可能需要申报

<item name="android:windowActionBar">true</item>
Run Code Online (Sandbox Code Playgroud)

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

更多细节可以在这里的文档中找到.具体来说,引用:

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


nto*_*rnl 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>
Run Code Online (Sandbox Code Playgroud)

我认为<item name="android:windowActionBar">true</item>可以使用其中的任何主题.


Muh*_*man 10

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

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

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

android:theme="@android:style/Theme.Holo.Light"
Run Code Online (Sandbox Code Playgroud)

最好将所有样式放入styles.xml并在任何地方使用它,"@style/themName"因此前一个样式将是

android:theme="@style/AppTheme"
Run Code Online (Sandbox Code Playgroud)

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

 <style name="AppTheme" parent="Theme.AppCompat.Light">
Run Code Online (Sandbox Code Playgroud)

提示:

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

    <uses-sdk android:minSdkVersion="14" />
    
    Run Code Online (Sandbox Code Playgroud)
  • 要在AndroidStudio中指定min SDK版本,您可以使用app的Gradle文件.

    android{
      defaultConfig{
        minSdkVersion 14
        targetSdkVersion 21
      }
    }
    
    Run Code Online (Sandbox Code Playgroud)


Pra*_*ngh 8

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


NEE*_*PTA 7

转到AndroidManifest.xml并替换

机器人:主题= "@风格/ AppTheme"

by 
Run Code Online (Sandbox Code Playgroud)

机器人:主题= "@安卓风格/ Theme.Holo.Light.DarkActionBar"


小智 6

使用getSupportActionBar()而不是getActionBar()