【问题标题】:Android Error [Attempt to invoke virtual method 'void android.app.ActionBar' on a null object reference]Android 错误 [尝试在空对象引用上调用虚拟方法 'void android.app.ActionBar']
【发布时间】:2015-03-24 13:02:39
【问题描述】:

我有一个代码模块,它使用导航抽屉实现 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() 将起作用

但是如果在manifest中为activity申请的主题如下 android:theme="@style/Theme.AppCompat.Light" 那么你必须使用 getSupportActionBar()

【问题讨论】:

  • 你试试getSupportActionbar()
  • 我已经在我的代码中使用 getSupportActionbar
  • 你用过App兼容主题吗?您应该在此处发布您的清单和您的活动声明以获得进一步的帮助。
  • 您应该再次查看您的代码。我可以用你的主题获得supportActionBar(非空)。您是否将所有getActionBar 替换为getSupportActionBar?还有 1 件事,你应该更新你的新错误日志。
  • 我查看了您的代码。其实你在MainActivity里面还是用getActionBar()...检查一下改成getSupportActionBar

标签: android


【解决方案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()的。

【讨论】:

【解决方案2】:

如果有人想使用 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,如this answer
  • 当然@Keith,如果你想使用 AppCompat 主题,你必须使用 AppCompatActivity 否则你会遇到同样的不兼容问题。
  • @crubio 谢谢!
【解决方案3】:

当你扩展 appcompatActivity 然后使用

this.getSupportActionBar().setDisplayHomeAsUpEnabled(true);

当你扩展 ActionBar 然后使用

this.getActionBar().setDisplayHomeAsUpEnabled(true);

初始化toolbar/actionbar后不要忘记在oncreate中调用这个函数

【讨论】:

  • 我不知道如何调用这个函数,请你告诉我这个函数的方法-Fazal
  • 根据您的使用情况分别使用相应的课程来扩展您的课程。这是java而不是kotlin的代码,几年前添加的我不确定android是否改变了它
【解决方案4】:

我认为你想要做的是转换 getActivity()。例如:

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

这是您需要对新的支持库执行的操作。 AppCompatActivity 已替换 ActionBarActivity。

【讨论】:

    【解决方案5】:

    试试看这里

    res >> values >> styles.xml

    确保没有这样的代码

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

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

    【讨论】:

    • 谢谢提醒!! :D 我还留在了&lt;item name="windowNoTitle"&gt;true&lt;/item&gt;,必须删除。
    • 对我来说,有效的方法是从 AndroidManifest.xml 上的 &lt;avticity&gt; 标记中删除 android:theme="@style/AppTheme.NoActionBar"
    【解决方案6】:

    使用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】:

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

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

      将其更改为其他修复它:

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

      【讨论】:

        【解决方案8】:

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

        【讨论】:

          【解决方案9】:

          如果遇到这个错误

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

          随便用

          setSupportActionBar (toolbar). 
          

          【讨论】:

            【解决方案10】:

            在您的活动中的这一行:

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

            使用这个:

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

            * 是你的活动

            【讨论】:

              【解决方案11】:

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

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

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

              【讨论】:

                【解决方案12】:

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

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

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

                【讨论】:

                  【解决方案13】:

                  最佳解决方案 在您的 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);
                      }
                  
                  

                  【讨论】:

                  • 虽然这段代码 sn-p 可能会回答这个问题,包括解释为什么以及如何帮助解决问题,但可以提高答案的质量和寿命。见How do I write a good answer?
                  【解决方案14】:

                  试试这个希望它会工作,我的代码工作正常

                  Toolbar toolbar = findViewById(R.id.toolbar1);
                  setSupportActionBar(toolbar);
                  
                  getSupportActionBar().setDisplayHomeAsUpEnabled(true);
                  getSupportActionBar().setHomeButtonEnabled(true);
                  getSupportActionBar().setTitle("");
                  

                  【讨论】:

                    【解决方案15】:

                    如果你正在使用 android.app.ActionBar 和 android.app.Activity 你应该在应用标签中更改应用主题:

                    < application
                         android:theme="@android:style/Theme.Holo.Light">
                    

                    【讨论】:

                      【解决方案16】:

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

                      我试图创建一个带有视频背景的 Home Activity,为此我不得不将父主题从默认设置 Theme.AppCompat.Light.DarkActionBar 更改为 Theme.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">
                        

                      【讨论】:

                        【解决方案17】:

                        对于任何其他拥有 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);
                        

                        【讨论】:

                          【解决方案18】:

                          对于那些仍然有这个问题的人,我的问题在 AndroidManifest.xml 文件中得到了解决。在上面写着&lt;activity android:name=".MainActivity" android:theme="@style/AppTheme.NoActionBar"&gt; 的地方,您需要删除NoActionBar,使其变为&lt;activity android:name=".MainActivity" android:theme="@style/AppTheme"&gt;,因为使用NoActionBar 设置,当您在MainActivity.java 中调用一个操作栏时,应用程序不知道它是否需要一个操作栏

                          【讨论】:

                            【解决方案19】:

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

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

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

                            【讨论】:

                              【解决方案20】:

                              你应该试试这个。我认为它会起作用。

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

                              【讨论】:

                                【解决方案21】:

                                请在Toolbar后添加

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

                                【讨论】:

                                  【解决方案22】:

                                  我没有使用 AppCompat,但正在使用 android.app.Activity 和 android.widget.Toolbar。我也遇到了类似上面的错误。记下我为解决问题所做的事情,以防其他人遇到类似问题:

                                  我。对我来说,主题没有任何影响。我继续使用 Theme.AppCompat.Light.DarkActionBar

                                  二。确保您的工具栏布局具有工具栏条目:

                                  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                                      android:layout_width="match_parent"
                                      android:layout_height="match_parent">
                                      <Toolbar
                                          android:id="@+id/toolbar"
                                          android:layout_width="match_parent"
                                          android:layout_height="?attr/actionBarSize"
                                          android:background="@color/design_default_color_primary"
                                          android:titleTextColor="@color/white"
                                          android:theme="@style/Theme.Material3.Dark"
                                          />
                                  
                                  </LinearLayout>
                                  

                                  三。在您的活动的布局文件中,确保包含上述内容:

                                  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                                      xmlns:app="http://schemas.android.com/apk/res-auto"
                                      xmlns:tools="http://schemas.android.com/tools"
                                      android:layout_width="match_parent"
                                      android:layout_height="match_parent"
                                      android:orientation="vertical"
                                      tools:context=".ChildActivity">
                                  
                                      <include layout="@layout/child_toolbar"
                                          android:id="@+id/child_toolbar"
                                          android:layout_width="match_parent"
                                          android:layout_height="?attr/actionBarSize"/>
                                  
                                  </LinearLayout>
                                  

                                  四。在你的activity的onCreate函数中设置ActionBar如下:

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

                                  【讨论】:

                                    【解决方案23】:

                                    每当出现此类错误时。尝试检查以下内容

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

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

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

                                    但如果 manifest 中为 Activity 申请的主题如下 android:theme="@style/Theme.AppCompat.Light" 那么你必须使用 getSupportActionBar()

                                    【讨论】:

                                      【解决方案24】:

                                      如果你创建了一个新的工具栏然后 应用检查你是否应用了方法 setSupportActionBar(); 它肯定会帮助你

                                      【讨论】:

                                        【解决方案25】:

                                        尝试这样做:

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

                                        【讨论】:

                                        • 如果actionBar 变量中已经有结果,为什么还要调用getSupportActionBar()?两种变体都不好。
                                        • 你改变 getSupportActionBar();到 actionBar = getSupportActionBar();一样的!!!!抖腿!!!!!!
                                        • 没什么区别
                                        猜你喜欢
                                        • 1970-01-01
                                        • 1970-01-01
                                        • 1970-01-01
                                        • 1970-01-01
                                        • 2016-11-12
                                        • 1970-01-01
                                        • 1970-01-01
                                        • 1970-01-01
                                        • 2021-08-30
                                        相关资源
                                        最近更新 更多