NullPointerException while setting toolbar

2019-06-23 21:47发布

I've got the following XML Layout :

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/mycloud">

    <include
        android:id="@+id/app_bar"
        layout="@layout/tool_bar" />


</LinearLayout>

With the include tool_bar being :

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/primaryColour"
    android:paddingTop="0dp"
    app:title="Noteu"
    app:theme="@style/myCustomToolBarTheme"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Dark"
    >

</android.support.v7.widget.Toolbar>

However when I try to set the toolbar with the following class :

import android.nfc.Tag;
import android.os.Bundle;
import android.os.PersistableBundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;

import it.neokree.materialtabs.MaterialTab;
import it.neokree.materialtabs.MaterialTabHost;
import it.neokree.materialtabs.MaterialTabListener;

public class MyCloud extends ActionBarActivity implements MaterialTabListener{

    private Toolbar toolbar;

    private MaterialTabHost tabHost;
    private ViewPager viewPager;

    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.mycloud);

        toolbar = (Toolbar) findViewById(R.id.tool_bar);
        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    }

}

I get the following error via Logcat :

3-19 22:47:33.183  29878-29878/uk.co.noteu E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: uk.co.noteu, PID: 29878
    java.lang.RuntimeException: Unable to start activity ComponentInfo{uk.co.noteu/uk.co.noteu.MyCloud}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.CharSequence android.support.v7.widget.Toolbar.getTitle()' on a null object reference
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2314)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2388)
            at android.app.ActivityThread.access$800(ActivityThread.java:148)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1292)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5312)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.CharSequence android.support.v7.widget.Toolbar.getTitle()' on a null object reference
            at android.support.v7.internal.widget.ToolbarWidgetWrapper.<init>(ToolbarWidgetWrapper.java:95)
            at android.support.v7.internal.widget.ToolbarWidgetWrapper.<init>(ToolbarWidgetWrapper.java:88)
            at android.support.v7.internal.app.ToolbarActionBar.<init>(ToolbarActionBar.java:82)
            at android.support.v7.app.ActionBarActivityDelegateBase.setSupportActionBar(ActionBarActivityDelegateBase.java:189)
            at android.support.v7.app.ActionBarActivity.setSupportActionBar(ActionBarActivity.java:92)
            at uk.co.noteu.MyCloud.onCreate(MyCloud.java:35)
            at android.app.Activity.performCreate(Activity.java:5953)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1128)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2267)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2388)
            at android.app.ActivityThread.access$800(ActivityThread.java:148)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1292)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5312)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372

The tool bar is part of a larger application but I've narrowed down the problem to that and removed all other code leaving with what's above. The code was compiled and tested like it is above.

3条回答
Melony?
2楼-- · 2019-06-23 22:12

Toolbar Id should match.

create folder for version 21 and above(values-v21) and paste the below code in style.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">

        <!-- android theme colors -->
        <item name="android:colorPrimary">@color/theme_dialer_primary</item>
        <item name="android:colorPrimaryDark">@color/theme_dialer_high</item>
        <item name="android:colorAccent">@color/theme_dialer_accent</item>
        <item name="android:navigationBarColor">@color/theme_dialer_primary</item>

        <!-- android transitions -->
        <item name="android:windowContentTransitions">true</item>
        <item name="android:windowAllowEnterTransitionOverlap">true</item>
        <item name="android:windowAllowReturnTransitionOverlap">true</item>
        <item name="drawerArrowStyle">@style/DrawerArrowStyle</item>
    </style>


    <style name="TransitionSampleActivity" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:colorPrimaryDark">@color/color_set_1_primary</item>
        <item name="android:colorPrimary">@color/color_set_1_primary</item>
        <item name="android:colorAccent">@color/color_set_1_accent</item>
    </style>

    <style name="TransitionSampleSecondActivity" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:colorPrimaryDark">@color/color_set_1_primary</item>
        <item name="android:colorPrimary">@color/color_set_1_primary</item>
        <item name="android:colorAccent">@color/color_set_1_accent</item>
    </style>

    <style name="theme1" parent="AppTheme">
        <item name="android:colorPrimary">@color/color_set_1_primary</item>
        <item name="android:colorControlActivated">@color/color_set_1_accent</item>
        <item name="android:colorAccent">@color/color_set_1_accent</item>
    </style>

    <style name="theme2" parent="AppTheme">
        <item name="android:colorPrimary">@color/color_set_2_primary</item>
        <item name="android:colorControlActivated">@color/color_set_2_accent</item>
        <item name="android:colorAccent">@color/color_set_2_accent</item>
    </style>

    <style name="theme3" parent="AppTheme">
        <item name="android:colorPrimary">@color/color_set_3_primary</item>
        <item name="android:colorControlActivated">@color/color_set_3_accent</item>
        <item name="android:colorAccent">@color/color_set_3_accent</item>
    </style>

    <style name="theme4" parent="AppTheme">
        <item name="android:colorPrimary">@color/color_set_4_primary</item>
        <item name="android:colorControlActivated">@color/color_set_4_accent</item>
        <item name="android:colorAccent">@color/color_set_4_accent</item>
    </style>

    <style name="DrawerArrowStyle" parent="Widget.AppCompat.DrawerArrowToggle">
        <item name="spinBars">true</item>
        <item name="color">@android:color/white</item>
    </style>

    <style name="SlidingTextViewStyle" parent="@android:style/Widget.TextView">
        <item name="android:fontFamily">sans-serif-medium</item>
        <item name="android:textColor">#FFF</item>
    </style>
</resources>

Under values folder style.xml add below code

<resources>
    <style name="AppTheme" parent="MyTheme.Base">
    </style>
    <!-- Base theme applied no matter what API -->
    <style name="MyTheme.Base" parent="Theme.AppCompat.Light.DarkActionBar">
        <!--If you are using revision 22.1 please use just windowNoTitle. Without android:-->
        <item name="android:windowNoTitle">true</item>
        <!--We will be using the toolbar so no need to show ActionBar-->
        <item name="windowActionBar">false</item>
        <!-- Set theme colors from http://www.google.com/design/spec/style/color.html#color-color-palette-->
        <!-- colorPrimary is used for the default action bar background -->
        <item name="colorPrimary">#2196F3</item>
        <!-- colorPrimaryDark is used for the status bar -->
        <item name="colorPrimaryDark">#1976D2</item>
        <!-- colorAccent is used as the default value for colorControlActivated
             which is used to tint widgets -->
        <item name="colorAccent">#FF4081</item>
        <!-- You can also set colorControlNormal, colorControlActivated
            colorControlHighlight and colorSwitchThumbNormal. -->
    </style>
</resources>

In Manifest file:

 <application
        android:theme="@style/AppTheme" >

Change toolbar to:

<android.support.v7.widget.Toolbar
            xmlns:local="http://schemas.android.com/apk/res-auto"
            android:id="@+id/toolbar"
            android:layout_height="wrap_content"
            android:layout_width="match_parent"
            android:minHeight="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            local:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
            local:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>

Toolbar Id should match.

Now the actionbar can be viewed in API version21 and above as well as lower versions.

查看更多
相关推荐>>
3楼-- · 2019-06-23 22:28
     <include android:id="@+id/app_bar"
                layout="@layout/tool_bar" />

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

Find Your Included View in Your LayoutFile.Easy to access your toolbar without anyerror.

查看更多
虎瘦雄心在
4楼-- · 2019-06-23 22:31

The IDs of your toolbar in layout and code don't match, you used the name of the layout instead of the actual id. You're probably getting a null pointer during findViewById, and setting null as your actionbar.

查看更多
登录 后发表回答