Android错误[尝试在空对象引用上调用虚拟方法';void Android.app.ActionBar']
我有一个代码模块,它实现了带有导航抽屉的viewpager,但是,当我运行代码时,我得到了以下错误Android错误[尝试在空对象引用上调用虚拟方法';void Android.app.ActionBar'],android,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.tabwi
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
指向这条线
// enabling action bar app icon and behaving it as a toggle button
getActionBar().setDisplayHomeAsUpEnabled(true);
getActionBar().setHomeButtonEnabled(true);
整个代码
我的舱单
<?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>
==================================================================
编辑/更新:
我从中学到了什么
每当发生这种错误时
1。检查正在使用的活动类型,是简单的android.app活动还是AppCompatActivity或ActionBarActivity等。
2。检查扩展的活动类型是否属于compat类别
例如,基于android.app的活动/片段是非appCompat类型,
鉴于android.support.v4.app.Fragment或android.support.v4.app.ActivityCompat
是否基于appCompat
如果它属于appCompat,则使用getSupportActionBar()
对于android.app类型,我们可以使用getActionBar()
3。检查清单文件中应用于相关活动的主题
例如:
如果应用了主题,则在清单文件中
android:theme=“@android:style/theme.Holo.Dialog”
getActionBar()将起作用
但是如果清单中的活动应用的主题如下
android:theme=“@style/theme.AppCompat.Light”
那么你必须使用
getSupportActionBar()尝试执行以下操作:
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);
您的代码正在抛出com.example.tabwithslidingdrawer.MainActivity.onCreate(MainActivity.java:95)
:
问题很简单-您的活动
继承自新的。您应该使用呼叫来代替
如果您在代码的第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]);
getSupportActionBar().setTitle(
Html.fromHtml(“+mTitle+”--”
+菜单项[0]+“”);
//getActionBar().setTitle(mTitle+menutilites[0]);
请注意您是如何注释掉的getActionBar()
我想您要做的是强制转换getActivity()。例如:
<style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
((AppCompatActivity)getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true)代码>
这就是您需要对新支持库执行的操作。AppCompatActivity已取代ActionBarActivity。如果有人想使用android.app.ActionBar和android.app.Activity,您应该在style.xml中更改应用程序主题,例如:
<style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
问题是您可能正在使用AppCompat主题
另一方面,如果您想使用android.support.v7.app.ActionBar并使用AppCompatActivity扩展活动,则必须使用AppCompat主题来避免此问题,例如:
<style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
希望这有帮助 对于低级别活动,向上按钮通常被激活。在你的清单中,我只看到主要活动。
我认为在主要活动中激活向上按钮没有意义。
创建一个活动,然后在清单中添加parentActivityName属性。
然后激活活动的onCreate方法上的向上按钮。
这应该会有所帮助。
对于拥有BaseActivity及其扩展子级的任何其他人,请确保在执行任何操作之前先调用super.onCreate()。如果之后调用super.onCreate(),则旧的活动将起作用
孩子扩展活动-可以在你完成任务后调用super
孩子的活动-你得先打电话给super
当您扩展appcompatActivity时,请使用
this.getSupportActionBar().setDisplayHomeAsUpEnabled(true);
当您扩展ActionBar时,请使用
this.getActionBar().setDisplayHomeAsUpEnabled(true);
初始化工具栏/actionbar后,不要忘记在oncreate中调用此函数。如果您使用的是android.app.actionbar和android.app.Activity,则应在应用程序标记中更改应用程序主题:
< application
android:theme="@android:style/Theme.Holo.Light">
<应用程序
android:theme=“@android:style/theme.Holo.Light”>
对于仍然存在此问题的用户,我的问题已在AndroidManifest.xml文件中得到解决。当它显示
时,您需要删除NoActionBar
,使其成为
,因为使用NoActionBar设置,当您在MainActivity中调用一个操作栏时,应用程序不知道它是否需要一个操作栏。java尝试在此处检查
res>>值>>样式.xml
确保没有这样的代码
<item name="windowActionBar">false</item>
false
如果有类似的代码,您可以禁用一段时间,或者在活动的这一行中删除它:
super.onCreate(savedInstanceState);
setContentView(R.layout.Activity_Main);
使用以下命令:
super.onCreate(savedInstanceState);
setContentView(R.layout.*);
*
是您的活动吗在我的情况下,我也有同样的错误,但我的错误是我没有声明我的工具栏
因此,在使用getSupportActionBar之前,我必须找到我的工具栏并设置actionBar
appbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(appbar);
getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_nav_menu);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
在我的例子中是因为style.xml
设置了错误的父主题,即NoActionBar
主题当然getSupportActionbar()
为空:
<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()之前
有一次我遇到了同样的错误,我为默认工具栏(toolbar.xml)创建了一个模板,然后在另一个视图中创建了一个可折叠工具栏
我需要将可折叠工具栏添加到显示用户某些信息的视图中(如whatsapp),但findViewById方法引用的是默认工具栏(id工具栏),而不是可折叠工具栏(id工具栏)。是的,我将相同的id写入两个工具栏,因此,当我试图访问该活动时,应用程序崩溃,显示错误
我通过将可折叠工具栏的id更改为id:col_toolbar来修复错误,错误消失了,我的应用程序工作得很好
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);
}
}
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();
}
};
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).
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().hide();
Theme.AppCompat.Light.DarkActionBar - for Activities with Action Bar (default)
Theme.AppCompat.Light.NoActionBar - for Activities without Action Bar
<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>
<activity android:name=".Payment"
android:theme="@style/DefaultTheme"/>
<activity android:name=".WelcomeHome"
android:theme="@style/AppTheme.NoActionBar">