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

ViV*_*ekH 93 android

我有一个代码模块,它实现了带导航抽屉的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
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)

指向这一行

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

整个代码 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>
Run Code Online (Sandbox Code Playgroud)

机器人:主题= "@风格/ Theme.Tabwithpager"

代码 http://pastebin.com/EFQLzRej

================================================== ================ 编辑/更新:

我从中学到了什么

每当发生这样的错误时

1.检查正在使用哪种Activity,是简单的android.app Activity还是AppCompatActivity或ActionBarActivity等等.

2.检查您的活动类型是否属于compat类别

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

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

3.在清单文件中检查应用于相关活动的主题

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

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

Fun*_*nal 143

你的代码正在抛弃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);
Run Code Online (Sandbox Code Playgroud)

问题很简单 - 你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);
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 请注意:[`android.support.v7.app.ActionBarActivity`](http://developer.android.com/reference/android/support/v7/app/ActionBarActivity.html)已被弃用,以支持[` android.support.v7.app.AppCompatActivity`](http://developer.android.com/reference/android/support/v7/app/AppCompatActivity.html).但问题是一样的. (8认同)

cru*_*bio 26

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

<style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
Run Code Online (Sandbox Code Playgroud)

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

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

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

希望这可以帮助.


Faz*_*zal 17

当你扩展appcompatActivity然后使用

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

当你扩展ActionBar然后使用

this.getActionBar().setDisplayHomeAsUpEnabled(true);
Run Code Online (Sandbox Code Playgroud)

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


小智 11

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

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

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


小智 6

尝试在这里检查

res >>值>> styles.xml

确保没有这样的代码

<item name="windowActionBar">false</item>
Run Code Online (Sandbox Code Playgroud)

如果有类似的代码,您可以暂时禁用或删除它

  • 对我来说,有效的方法是从 AndroidManifest.xml 上的 `&lt;avticity&gt;` 标签中删除 `android:theme="@style/AppTheme.NoActionBar"` (2认同)

林果皞*_*林果皞 6

就我而言,是因为styles.xml设置了错误的父主题,即NoActionBar主题当然getSupportActionbar()为空:

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

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

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


Ahm*_*deh 5

使用 AppCompatActivity 时必须调用

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
Run Code Online (Sandbox Code Playgroud)

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);

    }
}
Run Code Online (Sandbox Code Playgroud)