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


97

我有一个代码模块,该模块使用导航抽屉实现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): 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)

指向这条线

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

完整代码 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

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

我从中学到的

每当发生这样的错误

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

2.检查您扩展的活动类型是否属于兼容类别

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

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

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

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

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


3
你尝试getSupportActionbar()吗?
翠鸟Phuoc,2015年

我已经在我的代码中使用了getSupportActionbar
ViVekH 2015年

您是否使用过App Compat主题?您应该在此处将清单与活动声明一起发布,以获取更多帮助。
翠鸟Phuoc,2015年

您应该再次查看您的代码。我可以supportActionBar(不为null)获得您的主题。您是否全部替换getActionBargetSupportActionBar?还有1件事,您应该更新新的错误日志。
Kingfisher Phuoc 2015年

1
我看着你的代码。其实,你仍然可以使用getActionBar()你的MainActivity......它和变革检查getSupportActionBar
Kingfisher Phuoc 2015年

Answers:


151

您的代码引发了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是从new继承的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()


8
请注意:android.support.v7.app.ActionBarActivity已弃用,而赞成android.support.v7.app.AppCompatActivity。但是问题是一样的。
Funktional

1
在片段中,请参见此处
jacktrades 16/09/26

29

如果有人想使用android.app.ActionBarandroid.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">

希望这可以帮助。


您也可以从而AppCompatActivity不是扩展Activity,如该答案所示
基思

当然,@ Keith,如果要使用AppCompat主题,则必须使用AppCompatActivity,否则将遇到相同的不兼容问题。
crubio 2015年

@crubio谢谢!
Kumaresh Babu NS

18

当您扩展appcompatActivity然后使用

this.getSupportActionBar().setDisplayHomeAsUpEnabled(true);

当您扩展ActionBar然后使用

this.getActionBar().setDisplayHomeAsUpEnabled(true);

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


12

我认为您要执行的是强制转换getActivity()。例如:

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

这是您需要使用新的支持库进行的操作。AppCompatActivity已取代ActionBarActivity。


7

尝试在这里检查

res >>值>> styles.xml

确保没有这样的代码

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

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


谢谢提醒!!:DI也留在中<item name="windowNoTitle">true</item>,必须将其删除。
gujci

对我来说,有效的方法是android:theme="@style/AppTheme.NoActionBar"<avticity>AndroidManifest.xml的标签中删除
Smaily Carrilho,

4

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

    }
}


2

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

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

将其更改为其他固定方法:

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

2

试试这个希望它能工作,我的代码可以正常工作

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

getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
getSupportActionBar().setTitle("");

1

在您的活动的这一行中:

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

用这个:

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

* 是你的活动


1

就我而言,我有同样的错误,但是我的错误是我没有声明我的工具栏。

因此,在使用getSupportActionBar之前,我必须先找到工具栏并设置actionBar

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

    getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_nav_menu);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

1

我知道这个问题有点老了。但这可以帮助许多提出此问题的人。

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

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


1

如果遇到此错误

"java.lang.NullPointerException: Attempt to invoke virtual method 'void androidx.appcompat.app.ActionBar.setTitle (java.lang.CharSequence)' on a null object reference. "

只需使用

setSupportActionBar (toolbar). 

0

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

孩子扩展活动-做完事后可以叫超级

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

子级扩展AppCompatActivity-您必须先调用超级

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

0

对于仍然存在此问题的用户,我的问题已在AndroidManifest.xml文件中解决。它说的是<activity android:name=".MainActivity" android:theme="@style/AppTheme.NoActionBar">,您需要删除NoActionBar<activity android:name=".MainActivity" android:theme="@style/AppTheme">,因为有了NoActionBar设置,当您在MainActivity.java中调用一个应用程序时,该应用程序并不知道它是否需要一个操作栏。


0

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

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

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


0

您应该尝试这个。我认为它将起作用。

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

    mDrawerLayout = findViewById(R.id.drawer_layout);
    mDrawerLayout = findViewById(R.id.drawer_layout);
    mDrawerLayout.setDrawerShadow(R.drawable.rectagle_with_black_outer,
            GravityCompat.START);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setHomeButtonEnabled(true);

    mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
            toolbar, R.string.navigation_drawer_close,
            R.string.navigation_drawer_close) {
        public void onDrawerClosed(View view) {
            invalidateOptionsMenu();
        }

        public void onDrawerOpened(View drawerView) {
            invalidateOptionsMenu();
        }
    };

0

最好的解决方案在您的Oncreate方法中做到这一点

 ActionBar actionBar = getSupportActionBar();

        if(actionBar != null){
            actionBar.setDisplayHomeAsUpEnabled(true);
        }

然后是新班

@Override
    public boolean onOptionsItemSelected(MenuItem item) {

        int id = item.getItemId();

        if(id == android.R.id.home){
            onBackPressed();
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

尽管此代码段可能回答了问题,但对为什么以及如何帮助解决问题的解释也可以提高答案的质量和寿命。请参阅如何写一个好的答案?
ammportal,

0

请在之后添加 Toolbar

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

0

我是Android App开发的新手。我遇到了这个错误,花了将近5个小时来修复它。最后,我发现以下是此问题的根本原因,如果将来有人再次遇到此问题,请仔细阅读。

我试图创建一个带有视频背景的家庭活动,为此我不得不将其父主题从默认设置更改Theme.AppCompat.Light.DarkActionBarTheme.AppCompat.Light.NoActionBar。这对于Home Activity来说效果很好,但是当我使用onclicklistener设置一个新按钮来导航到另一个Activity(我在Action Bar上设置了自定义文本)时,就会引发此错误。

因此,我最终要做的是创建两个主题并将它们分配给以下活动。

Theme.AppCompat.Light.DarkActionBar - for Activities with Action Bar (default)
Theme.AppCompat.Light.NoActionBar - for Activities without Action Bar 

我进行了以下更改以修复错误。

  1. 在styles.xml中定义主题

    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>
    
    <style name="DefaultTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>
  2. 将活动与各自的主题相关联 AndroidManifest.xml

    <activity android:name=".Payment"
        android:theme="@style/DefaultTheme"/>
    
    <activity android:name=".WelcomeHome"
        android:theme="@style/AppTheme.NoActionBar">

-1

每当发生这样的错误。尝试检查以下事情

  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();对于android.app类型,我们可以使用getActionBar()

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

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

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



-3

尝试这样做:

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

getSupportActionBar()如果已经有actionBar变量的结果,为什么要调用?两种变体都是不好的。
Stan

您更改getSupportActionBar(); 到actionBar = getSupportActionBar(); 一样的!!!!摇一条腿!
Cabezas

没什么关系
crubio
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.