java 设置工具栏时出现 NullPointerException
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/29156468/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
NullPointerException while setting toolbar
提问by Hyman Trowbridge
I've got the following XML Layout :
我有以下 XML 布局:
<?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 :
包含 tool_bar 是:
<?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 :
我通过 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.access0(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.access0(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.
工具栏是一个更大的应用程序的一部分,但我已经将问题缩小到这一点,并删除了所有其他代码,留下了上面的内容。代码像上面一样被编译和测试。
回答by Gyome
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.
您的工具栏在布局和代码中的 ID 不匹配,您使用了布局的名称而不是实际的 ID。您可能在 findViewById 期间得到一个空指针,并将 null 设置为您的操作栏。
回答by siddharth patel
<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.
在您的 LayoutFile 中找到您包含的视图。轻松访问您的工具栏,没有任何错误。
回答by Sujay
Toolbar Id should match.
工具栏 ID 应该匹配。
create folder for version 21 and above(values-v21) and paste the below code in style.xml
为版本 21 及更高版本(values-v21)创建文件夹并将以下代码粘贴到 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
在值文件夹 style.xml 下添加以下代码
<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.
工具栏 ID 应该匹配。
Now the actionbar can be viewed in API version21 and above as well as lower versions.
现在操作栏可以在API version21及更高版本以及更低版本中查看。