Jack Trowbridge
Jack Trowbridge

Reputation: 3251

NullPointerException while setting toolbar

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.

Upvotes: 5

Views: 14544

Answers (3)

Siddharth Makadiya
Siddharth Makadiya

Reputation: 733

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

Upvotes: 3

Sujay
Sujay

Reputation: 601

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.

Upvotes: 0

Gyome
Gyome

Reputation: 1333

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.

Upvotes: 8

Related Questions