ActionBarActivity getSupportActionBar()。hide()抛出NullPointerException

时间:2013-11-22 15:00:31

标签: java android nullpointerexception android-support-library android-actionbar-compat

致电

 if (getSupportActionBar() != null)
     getSupportActionBar().hide();

或只是:

getActionBar()
在android.support.v7.app.ActionBarActivity中的

我得到了这样的异常:

    ...
    java.lang.NullPointerException
    at android.support.v7.app.ActionBarImplICS.hide(ActionBarImplICS.java:302)
    at android.support.v7.app.ActionBarImplJB.hide(ActionBarImplJB.java:20)
    ...

修改 它只是在活动有主题时发生:

<style name="MyTheme" parent="Theme.AppCompat.Light">
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowFullscreen">false</item>
    </style>

注意:

getSupportActionBar()

不返回null

4 个答案:

答案 0 :(得分:6)

遇到同样的问题,但我使用代码在下面设置全屏和noActionbar而不是xml中的主题:

protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN);
    getSupportActionBar().hide();
    setContentView(R.layout.page_welcome);
    initViews();
}

此代码在ICS之前运行良好,但由于ICS上方的NullPointException导致崩溃,经过一些实验,我得到了解决方案:删除一行代码,不设置标题如下:

protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    // requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN);
    getSupportActionBar().hide();
    setContentView(R.layout.page_welcome);
    initViews();
}

然后它适用于所有平台。 :)

答案 1 :(得分:2)

据我了解

if (getSupportActionBar() != null)
     getSupportActionBar().hide();

不正确!  Becouse getSupportActionBar()返回非空实例 (android.support.v7.app.ActionBarImplICS

之后我们可以调用hide函数(getSupportActionBar().hide();

但是在这个函数里面我们会有NullPointerException,因为里面是变量mActionBar android.support.v7.app.ActionBarImplICS instance == null http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.3_r2.1/android/support/v7/app/ActionBarImplICS.java#302

据我了解android.support.v7.app.ActionBarImplICS的构造函数

 mActionBar = activity.getActionBar();

返回null,因为我们的Activity没有通过Theme的ActionBar

<style name="MyTheme" parent="Theme.AppCompat.Light">
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowFullscreen">false</item>
    </style>

答案 2 :(得分:1)

简而言之: <item name="android:windowNoTitle">true</item> 仅可与Activity一起使用,不能与ActionBarActivity

一起使用

另一方面,getSupportActionBar().hide(); 可与ActionBarActivity

一起使用

答案 3 :(得分:0)

对于ICS之前和ICS之后都有Theme.AppCompat.Light肯定会引起问题。这样做的方法是在MyTheme中设置:

  1. values/styles.xml。这将从Theme.AppCompat.Light延伸。例如:<style name="MyTheme" parent="Theme.AppCompat.Light">
  2. values-v11/styles.xml。这将从Holo主题延伸。例如:<style name="MyTheme" parent="android:Theme.Holo.Light">
  3. 通过这种方式,Android可以根据运行时设备主机API了解要加载的主题类型。

    getActionBar()延伸后,请勿致电ActionBarActivity。在post-ICS设备上,这将运行,但对于较低的API设备,您将获得运行时not supported method异常或类似的东西。