Android Error [尝试在空对象引用上调用虚方法‘ void Android.app. ActionBar’]

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

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>

机器人: 主题 = “@style/Theme. Tabwithpager”

密码 Http://pastebin.com/efqlzrej

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

我从中学到了什么

无论何时发生这样的错误

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

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

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

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

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

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

但如果应用于清单中的活动的主题如下所示 主题 = “@style/Theme. AppCompat. Light” 那你就得用 GetSupportActionBar ()

230753 次浏览

试试这样做:

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

Your code is throwing on 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()的。

I think what you want to do is cast getActivity(). For example:

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

这就是使用新的支持库所需要做的事情。

如果有人想使用 Android.app ActionBarAndroid.app 活动,你应该改变 Xml的应用程序主题,例如:

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

问题是您可能使用的是 AppCompat主题。

On the other hand, if you want to use V7.app. ActionBar and you extend your activity with AppCompatActivity then you must use an AppCompat theme to avoid this issue, for example:

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

希望这个能帮上忙。

上行按钮通常是为低级活动而激活的。在你的清单中我只看到主要活动。 我不认为激活主要活动的向上按钮是有意义的。 创建一个活动,然后在清单中添加 ParentActivityName 属性。 然后激活活动的 onCreate 方法上的 up 按钮。
这个应该有用。
Https://developer.android.com/training/appbar/up-action.html

对于任何拥有 BaseActivity 的其他用户,以及从 BaseActivity 扩展的子用户,请确保在执行任何操作之前首先调用 super.onCreate ()。如果之后调用 super.onCreate () ,那么旧的 Activity 将会工作。

孩子扩展活动-可以调用超级后,你做的事情

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

Child extends AppCompatActivity - ya gotta call super first

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

when you 扩展应用程序活动 then use

this.getSupportActionBar().setDisplayHomeAsUpEnabled(true);

当你 扩展动作条然后使用

this.getActionBar().setDisplayHomeAsUpEnabled(true);

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

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

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

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

看看这里

Res > > value > > styles.xml

make sure that there no code like this

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

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

在你的活动中:

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

使用:

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

* is your activity

In my case I had the same error but my mistake was that I didn't declare my Toolbar.

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

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


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

In my case is because of styles.xml set the wrong parent theme, i.e. NoActionBar theme of course getSupportActionbar() is null:

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

把它换成别的东西修好了:

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

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


}
}

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

I required to add the collapsable toolbar to a view that show some information of the user(like whatsapp), but the method findViewById was referencing the default toolbar(id toolbar), not the collapsable one( id toolbar as well) yes, I wrote the same id to both toolbar, so when I tried to access the activity the app crashed showing me the error.

我修正了这个错误,将可折叠工具栏的 id 改为 id: col_ toolbar,错误消失了,我的应用程序工作得很好

我知道这个问题已经有些年头了,但是这可以帮助很多提出这个问题的人。

为了解决这个问题,检查是否有一个无效点,然后应用相应的配置:

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

你应该试试这个,我想会有用的。

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

最好的解决办法 在 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);
}


尝试这个希望它将工作,我的代码是工作正常

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


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

如果遇到此错误

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

用就是了

setSupportActionBar (toolbar).

无论何时发生这样的错误,请尝试检查“下列事项”

  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 的

if it falls under appCompat we use getSupportActionBar() else for android.app types we can use getActionBar()

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

example: In the manifest file if theme applied is say android:theme="@android:style/Theme.Holo.Dialog" getActionBar() will work

但是如果为清单中的活动应用的主题如下 android:。AppCompat.然后必须使用 getSupportActionBar ()

请在 Toolbar后面添加

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

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

我试图创建一个视频背景的家庭活动,为此我必须将父主题从 Theme.AppCompat.Light.DarkActionBar的默认设置更改为 Theme.AppCompat.Light.NoActionBar。这对 Home Activity 很有效,但是当我设置一个带有 onclicklisten 的新按钮来导航到另一个 Activity 时,我已经在 Action Bar 中设置了一个自定义文本,这个错误将被抛出。

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

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

I have made the following changes to make fix the error.

  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. Associating the Activities to their Respective Themes in AndroidManifest.xml

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

如果你已经创建了一个新的工具栏,然后 应用检查,您已经应用了方法 setSupportActionBar () ; 它会在防卫上帮助你

我没有在使用 AppCompat,而是在使用 android.app。Activity and android. widget.工具栏。我也得到了一个类似上面的错误。下面是我为了解决这个问题而做的一些事情,以防其他人也有类似的问题:

对我来说,主题没有任何效果。我继续使用主题。应用程序。光。暗动作条

确保你的工具栏布局有工具栏条目:

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

在活动的 onCreate 函数中设置 ActionBar 如下:

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