Android的错误
我有一个代码模块,实现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):引起:java.lang.NullPointerException:试图调用null对象引用虚拟方法'void android.app.ActionBar.setDisplayHomeAsUpEnabled(boolean)'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 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>
机器人:主题= “@风格/ Theme.Tabwithpager”
代码http://pastebin.com/EFQLzRej
================================================== ================ 编辑/更新:
我从中学到了什么
每当发生这样的错误
1.检查正在使用什么样的Activity,是一个简单的android.app Activity还是一个AppCompatActivity或一个ActionBarActivity等等。
2.检查你的活动types是否属于compat类别
例如基于android.app的Activity / Fragment是非appCompattypes,而android.support.v4.app.Fragment或android.support.v4.app.ActivityCompat是基于appCompat
如果它属于appCompat,我们使用getSupportActionBar()else来获取android.apptypes,我们可以使用getActionBar()
3.在清单文件中检查应用于相关活动的主题
例如:在清单文件中,如果应用主题是说android:theme =“@ android:style / Theme.Holo.Dialog”getActionBar()将工作
但如果在清单中的活动应用主题如下android:theme =“@ style / Theme.AppCompat.Light”那么你必须使用getSupportActionBar()
你的代码正在抛出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
inheritance自新的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()
。
如果有人想要使用android.app.ActionBar和android.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然后使用
this.getSupportActionBar().setDisplayHomeAsUpEnabled(true);
当你扩展ActionBar然后使用
this.getActionBar().setDisplayHomeAsUpEnabled(true);
不要忘了在初始化工具栏/操作栏之后在oncreate中调用这个函数
我想你想要做的就是强制getActivity()。 例如:
((AppCompatActivity)getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true);
这是你需要做的新的支持库。 AppCompatActivity已经取代了ActionBarActivity。
向上button通常为低级活动激活。 在你的清单中,我只看到MainActivity。 我不认为激活主要活动的向上button是有意义的。 创build一个活动,然后在清单中添加parentActivityName属性。 然后激活活动的onCreate方法的向上button。
这应该有所帮助。
https://developer.android.com/training/appbar/up-action.html
尝试在这里检查
res >> values >> styles.xml
确保没有这样的代码
<item name="windowActionBar">false</item>
如果有这样的代码,你可以禁用一段时间,或删除它
对于任何具有BaseActivity的人员以及从其中扩展的孩子,请确保在执行任何操作之前先调用super.onCreate()。 如果以后调用super.onCreate(),则旧的Activity将起作用。
孩子延伸活动 – 可以打电话超级你做东西后
@Override protected void onCreate(Bundle savedInstanceState) { getActionBar().setDisplayHomeAsUpEnabled(true); super.onCreate(savedInstanceState);
孩子延伸AppCompatActivity – 你必须先超级打电话
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //do this first getSupportActionBar().setDisplayHomeAsUpEnabled(true);
在我的情况下,我有同样的错误,但我的错误是,我没有申报我的工具栏。
所以,在我使用getSupportActionBar之前,我必须find我的工具栏并设置actionBar
appbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(appbar); getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_nav_menu); getSupportActionBar().setDisplayHomeAsUpEnabled(true);
如果您使用的是android.app.ActionBar和android.app.Activity,则应该在应用程序标签中更改应用程序主题:
<应用程序
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里面调用一个时
在你的活动中的这一行:
super.onCreate(savedInstanceState); setContentView(R.layout.Activity_Main);
用这个:
super.onCreate(savedInstanceState); setContentView(R.layout.*);
*
是你的活动
在我的情况是因为styles.xml
设置错误的父主题,即当然NoActionBar
主题getSupportActionbar()
为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);
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); } }
尝试这样做:
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);