首页 文章

getActionBar()返回null

提问于
浏览
166

我有一个奇怪的问题 . 我正在使用targetsdk 13制作应用程序 .

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

我发现这非常奇怪,我看不出有什么理由会这样做 . 这是模拟器的错误还是我需要做的事情,以确保我的应用程序有一个操作栏?

SOLUTION: 我想我使用setContentView来设置活动的布局 . 相反,我使用 fragmentTransaction.add(android.R.id.content, mFragment, mTag) 向活动添加片段 . 这在3.2中运行良好,但在早期的蜂窝版本中,如果不在 onCreate() 方法中使用setContentView,则操作栏显然未设置 . 所以我通过在 onCreate() 方法中使用 setContentView() 方法修复它,并为其提供包含空FrameLayout的布局 . 我仍然可以像以前一样使用 fragmentTransaction.add(android.R.id.content, mFragment, mTag) 方法 .

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

23 回答

  • 10

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

  • 10

    如果您使用的是支持库

    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
    
  • 33

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

    使用

    requestWindowFeature(Window.FEATURE_ACTION_BAR);
    

    在调用setContentView()方法之前 .

  • 0

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

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

  • 8
    • 如果您正在使用 android.support.v7.app.AppCompatActivity

    公共类HomeActivity扩展AppCompatActivity {

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

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

    公共类HomeActivity扩展FragmentActivity {

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

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

    公共类HomeActivity扩展ActionBarActivity {

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

    ActionBar ab = getSupportActionBar();
    
  • 18

    ActionBar需要应用程序或活动的主题才能拥有应用程序 Headers . 确保您没有将您的应用程序或活动设置为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" >
    
  • 205

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

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

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

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

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

  • 31
    import android.support.v7.app.AppCompatActivity;
    

    然后

    extends AppCompatActivity
    

    然后用

    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    
  • 0

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

  • 46

    主要原因是使用不支持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版本,可以使用app的Gradle文件 .
    android{
      defaultConfig{
        minSdkVersion 14
        targetSdkVersion 21
      }
    }
    
  • 2

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

  • 18

    转到AndroidManifest.xml并替换

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

    by
    

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

  • 0

    使用getSupportActionBar()而不是getActionBar()

  • 0

    在我的情况下,我在我的代码中有这个不起作用:

    @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方法中调用的第一件事 .

  • 1

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

  • 7

    我遇到过同样的问题 . 它通过在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">
    
  • 31

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

    • 改变minifest android:theme="@android:style/Theme.Holo.Light" >

    • 添加到类 extends ActionBarActivity

    • 将导入添加到类 import android.support.v7.app.ActionBarActivity

  • 5

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

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

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

  • 27

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

    public class MyActivity extends ActionBarActivity
    {
      . . .
    

    在我的例子中,该类仅从Activity扩展 .

  • 4

    这也可以帮助一些人 .

    就我而言,这是因为我没有在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)失败了;代码是开源使用它!!

  • 2

    要添加到其他答案:

    确保在调用 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);
    
  • 0

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

    工作很快

相关问题