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

时间:2015-01-26 04:04:51

标签: 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
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。检查您的活动类型是否属于compat类别

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

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

第3。检查清单文件中适用于相关活动的主题

例如: 在清单文件中,如果应用主题是说 机器人:主题= “@安卓风格/ Theme.Holo.Dialog” getActionBar()将起作用

但是如果在清单中为活动应用的主题如下 机器人:主题= “@风格/ Theme.AppCompat.Light” 然后你必须使用 getSupportActionBar()

24 个答案:

答案 0 :(得分:141)

您的代码正在使用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()

答案 1 :(得分:26)

如果有人想使用 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 :(得分:15)

扩展appcompatActivity 时,请使用

this.getSupportActionBar().setDisplayHomeAsUpEnabled(true);

扩展ActionBar 时,请使用

this.getActionBar().setDisplayHomeAsUpEnabled(true);

不要忘记在初始化工具栏/操作栏

后在oncreate中调用此函数

答案 3 :(得分:11)

我认为你想要做的就是施放getActivity()。例如:

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

这是您需要对新支持库执行的操作。 AppCompatActivity取代了ActionBarActivity。

答案 4 :(得分:5)

尝试检查

res&gt;&gt;值&gt;&gt; styles.xml

确保没有像这样的代码

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

如果有类似的代码,您可以暂停一段时间,或将其删除

答案 5 :(得分:2)

通常为低级别活动激活“向上”按钮。在您的清单中,我只看到MainActivity。 我不认为激活主要活动的向上按钮是有意义的。 创建一个活动,然后在清单中添加parentActivityName属性。 然后激活活动的onCreate方法上的向上按钮 这应该有所帮助。
https://developer.android.com/training/appbar/up-action.html

答案 6 :(得分:2)

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

    }
}

答案 7 :(得分:2)

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

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

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

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

答案 8 :(得分:1)

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

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

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

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

答案 9 :(得分:1)

尝试此希望它可以工作,我的代码可以正常工作

result = weather_df.groupby('id').agg({
    'temperature': max_repeated_nans,
    'wind_speed': max_repeated_nans
})

答案 10 :(得分:1)

在您的活动中的这一行:

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

使用它:

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

*是您的活动

答案 11 :(得分:1)

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

&LT;应用

机器人:主题= “@机器人:风格/ Theme.Holo.Light” &GT;

答案 12 :(得分:1)

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

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

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

Child扩展了AppCompatActivity - 你必须先调用超级

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

答案 13 :(得分:0)

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

答案 14 :(得分:0)

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

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

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

答案 15 :(得分:0)

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

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

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

答案 16 :(得分: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();
        }
    };

答案 17 :(得分: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);
    }

答案 18 :(得分:0)

如果遇到此错误

 Button TranslateBtn = findViewById(R.id.TranslateBtn);

只需使用

  

setSupportActionBar(工具栏)。

答案 19 :(得分:0)

请在brown.tagged_sents(categories='romance')[501:600]

之后添加
from nltk.corpus import brown
import nltk

# Romance
brown_tagged_sents = brown.tagged_sents(categories='romance')[:500]
brown_sents = brown.sents(categories='romance') # not sure what this line is doing here
unigram_tagger = nltk.UnigramTagger(brown_tagged_sents)
unigram_tagger.evaluate(brown.tagged_sents(categories='romance')[501:600])

答案 20 :(得分:0)

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

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

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

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">
    

答案 21 :(得分:-1)

每当发生此类错误时。尝试检查关注的事情

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

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

基于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()

答案 22 :(得分:-1)

如果您创建了一个新的工具栏,则 应用检查您是否已应用方法setSupportActionBar(); 它会毫无帮助的

答案 23 :(得分:-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);