首页 文章

Android错误[尝试在空对象引用上调用虚方法'void android.app.ActionBar']

提问于
浏览
81

我有一个代码模块,它实现了带导航抽屉的viewpager,但是,当我运行代码时,我得到以下错误

01-26 09:20:02.958: D/AndroidRuntime(18779): Shutting down VM
01-26 09:20:02.959: E/AndroidRuntime(18779): FATAL EXCEPTION: main
01-26 09:20:02.959: E/AndroidRuntime(18779): Process: com.example.tabwithslidingdrawer, PID: 18779
01-26 09:20:02.959: E/AndroidRuntime(18779): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.tabwithslidingdrawer/com.example.tabwithslidingdrawer.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.app.ActionBar.setDisplayHomeAsUpEnabled(boolean)' on a null object reference
01-26 09:20:02.959: E/AndroidRuntime(18779):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2314)
01-26 09:20:02.959: E/AndroidRuntime(18779):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2388)
01-26 09:20:02.959: E/AndroidRuntime(18779):    at android.app.ActivityThread.access$800(ActivityThread.java:148)
01-26 09:20:02.959: E/AndroidRuntime(18779):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1292)
01-26 09:20:02.959: E/AndroidRuntime(18779):    at android.os.Handler.dispatchMessage(Handler.java:102)
01-26 09:20:02.959: E/AndroidRuntime(18779):    at android.os.Looper.loop(Looper.java:135)
01-26 09:20:02.959: E/AndroidRuntime(18779):    at android.app.ActivityThread.main(ActivityThread.java:5312)
01-26 09:20:02.959: E/AndroidRuntime(18779):    at java.lang.reflect.Method.invoke(Native Method)
01-26 09:20:02.959: E/AndroidRuntime(18779):    at java.lang.reflect.Method.invoke(Method.java:372)
01-26 09:20:02.959: E/AndroidRuntime(18779):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
01-26 09:20:02.959: E/AndroidRuntime(18779):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)
01-26 09:20:02.959: E/AndroidRuntime(18779): Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.app.ActionBar.setDisplayHomeAsUpEnabled(boolean)' on a null object reference
01-26 09:20:02.959: E/AndroidRuntime(18779):    at com.example.tabwithslidingdrawer.MainActivity.onCreate(MainActivity.java:95)
01-26 09:20:02.959: E/AndroidRuntime(18779):    at android.app.Activity.performCreate(Activity.java:5953)
01-26 09:20:02.959: E/AndroidRuntime(18779):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1128)
01-26 09:20:02.959: E/AndroidRuntime(18779):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2267)
01-26 09:20:02.959: E/AndroidRuntime(18779):    ... 10 more

09:20:02.959:E / AndroidRuntime(18779):引起:
java.lang.NullPointerException:尝试调用虚方法'void
在null上的android.app.ActionBar.setDisplayHomeAsUpEnabled(boolean)'
对象参考01-26 09:20:02.959:E / AndroidRuntime(18779):at
com.example.tabwithslidingdrawer.MainActivity.onCreate(MainActivity.java:95)

指向这一行

// enabling action bar app icon and behaving it as a toggle button
        getActionBar().setDisplayHomeAsUpEnabled(true);
        getActionBar().setHomeButtonEnabled(true);

entire code http://pastebin.com/u1K72fr7

我的清单

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.tabwithslidingdrawer"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="19" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/Theme.Tabwithpager" >
        <activity
            android:name="com.example.tabwithslidingdrawer.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

android:theme="@style/Theme.Tabwithpager"

代码 http://pastebin.com/EFQLzRej

================================================== ================ EDIT/UPDATE:

我从中学到了什么

每当发生这样的错误时

1. Check what kind of Activity is being used, is it a simple android.app Activity or an AppCompatActivity or an ActionBarActivity and so on.

2. Check if your activity type which is extended falls under the compat category

示例基于android.app的Activity / Fragment是非appCompat类型,而android.support.v4.app.Fragment或android.support.v4.app.ActivityCompat是基于appCompat的

如果它属于appCompat我们使用getSupportActionBar()else for android.app类型我们可以使用getActionBar()

3. Check the theme applied to the activity in question in the manifest file

示例:在清单文件中,如果应用主题是说android:theme =“@ android:style / Theme.Holo.Dialog”getActionBar()将工作

但如果主题应用于清单中的活动如下android:theme =“@ style / Theme.AppCompat.Light”那么你必须使用getSupportActionBar()

16 回答

  • 1

    你的代码正在抛出 com.example.tabwithslidingdrawer.MainActivity.onCreate(MainActivity.java:95)

    // enabling action bar app icon and behaving it as toggle button
            getActionBar().setDisplayHomeAsUpEnabled(true);
            getActionBar().setHomeButtonEnabled(true);
    

    问题很简单 - 你的 Activity 继承自新的android.support.v7.app.ActionBarActivity . 您应该使用getSupportActionBar()而不是getActionBar() .

    如果您查看代码第65行的上方,您会看到您已经在执行此操作:

    actionBar = getSupportActionBar();
            actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
            // TODO: Remove the redundant calls to getSupportActionBar()
            //       and use variable actionBar instead
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
            getSupportActionBar().setHomeButtonEnabled(true);
    

    然后在第87行下降,看起来你想出了同样的结果:

    getSupportActionBar().setTitle(
                            Html.fromHtml("<font color=\"black\">" + mTitle + " - "
                                            + menutitles[0] + "</font>"));
            // getActionBar().setTitle(mTitle +menutitles[0]);
    

    请注意你是如何注释掉 getActionBar() 的 .

  • 0

    如果有人想使用android.app.ActionBar和android.app.Activity,你应该在 styles.xml 中更改应用主题,例如:

    <style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
    

    问题是你可能正在使用AppCompat主题 .

    另一方面,如果您想使用android.support.v7.app.ActionBar并使用AppCompatActivity扩展您的活动,则必须使用AppCompat主题来避免此问题,例如:

    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    

    希望这可以帮助 .

  • 2

    当你 extend appcompatActivity 然后使用

    this.getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    

    当你 extend ActionBar 然后使用

    this.getActionBar().setDisplayHomeAsUpEnabled(true);
    

    不要忘记在初始化工具栏/操作栏后在oncreate中调用此函数

  • 2

    我想你想要做的是强制转换getActivity() . 例如:

    ((AppCompatActivity)getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    这是您需要使用新的支持库 . AppCompatActivity已取代ActionBarActivity .

  • 1

    试试看这里

    res >> values >> styles.xml

    确保没有这样的代码

    <item name="windowActionBar">false</item>
    

    如果有这样的代码,你可以暂停一段时间,或删除它

  • 0

    通常为低级别活动激活“向上”按钮 . 在您的清单中,我只看到MainActivity . 我没有't think it makes sense to activate the up button for the main activity. Create an activity, then in the manifest add the parentActivityName attribute. Then activate the up button on the activity' s onCreate方法 .
    这应该有所帮助 .
    https://developer.android.com/training/appbar/up-action.html

  • 1

    在我的情况下,我有同样的错误,但我的错误是我没有声明我的工具栏 .

    所以,在我使用getSupportActionBar之前,我必须找到我的工具栏并设置actionBar

    appbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(appbar);
    
        getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_nav_menu);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    
  • 11

    使用AppCompatActivity时必须调用

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    

    之前 getSupportActionBar()

    public class PageActivity extends AppCompatActivity {
         @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_item);
            Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
            setSupportActionBar(toolbar);
            this.getSupportActionBar().setDisplayHomeAsUpEnabled(false);
    
        }
    }
    
  • 13

    对于拥有BaseActivity的任何其他人以及从中扩展的子项,请确保在执行任何操作之前先调用super.onCreate() . 如果您之后调用了super.onCreate(),则旧的Activity将起作用 .

    Child扩展Activity - 在你做完东西之后可以调用super

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        getActionBar().setDisplayHomeAsUpEnabled(true);
        super.onCreate(savedInstanceState);
    

    Child扩展了AppCompatActivity - 你必须首先调用super

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState); //do this first
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    
  • -3

    如果您使用的是android.app.ActionBar和android.app.Activity,则应更改应用程序标记中的应用主题:

    <申请

    android:theme =“@ android:style / Theme.Holo.Light”>

  • 135

    在你活动的这一行:

    super.onCreate(savedInstanceState);
    setContentView(R.layout.Activity_Main);
    

    用这个:

    super.onCreate(savedInstanceState);
    setContentView(R.layout.*);
    

    * 是你的活动

  • 1

    在我的情况下是因为 styles.xml 设置了错误的父主题,即 NoActionBar 主题当然 getSupportActionbar() 为null:

    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    

    将其更改为修复它的其他内容:

    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    
  • 2

    对于仍然遇到此问题的人,我的问题已在AndroidManifest.xml文件中得到解决 . 如果它说 <activity android:name=".MainActivity" android:theme="@style/AppTheme.NoActionBar"> ,你需要删除 NoActionBar ,使其成为 <activity android:name=".MainActivity" android:theme="@style/AppTheme"> ,因为使用NoActionBar设置应用程序不知道当你调用一个内部时它是否需要一个操作栏MainActivity.java

  • 24

    我得到了同样的错误,我为默认工具栏(toolbar.xml)创建了一个模板,然后在另一个视图中创建了一个可折叠的工具栏 .

    我需要将可折叠工具栏添加到显示用户的一些信息的视图(如whatsapp),但方法findViewById引用默认工具栏(id工具栏),而不是可折叠的工具栏(id工具栏)是的,我写的两个工具栏都有相同的ID,因此当我尝试访问该活动时,应用程序崩溃显示错误 .

    我通过将可折叠工具栏的ID更改为id:col_toolbar来修复错误,错误消失了,我的应用程序运行完美

  • 3

    我知道这个问题已经过时了 . 但这可以帮助许多提出这个问题的人 .

    要解决此问题,请检查是否存在无效点 . 然后应用相应的配置:

    if(getSupportActionBar() != null){
     getSupportActionBar().setDisplayHomeAsUpEnabled(true);
     getSupportActionBar().setHomeButtonEnabled(true);
    }
    
  • 0

    试着这样做:

    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
                    getSupportActionBar().setHomeButtonEnabled(true);
                    actionBar = getSupportActionBar();
                    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
    

    而不是这个:

    actionBar = getSupportActionBar();
                    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
    
                    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
                    getSupportActionBar().setHomeButtonEnabled(true);
    

相关问题