将App转为Library模块合并后启动Activity崩溃:ActionBar空指针问题
解决Library模块Activity启动时ActionBar空指针崩溃问题
问题场景
创建Android项目Project A,导入已转换为Library模块的完整App项目Project B。启动B模块内的com.myapplication.testing.activity时应用崩溃,触发空指针异常。
报错信息
D/AndroidRuntime: Shutting down VM E/AndroidRuntime: FATAL EXCEPTION: main Process: com.project.fullapp, PID: 18007 java.lang.RuntimeException: Unable to resume activity {com.project.fullapp/com.myapplication.testing.activity}: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.app.ActionBar.isShowing()' on a null object reference at android.app.ActivityThread.performResumeActivity(ActivityThread.java:5230) at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:5269) at android.app.servertransaction.ResumeActivityItem.execute(ResumeActivityItem.java:54) at android.app.servertransaction.ActivityTransactionItem.execute(ActivityTransactionItem.java:45) at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:176) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2438) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loopOnce(Looper.java:226) at android.os.Looper.loop(Looper.java:313) at android.app.ActivityThread.main(ActivityThread.java:8669) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:571) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1135) Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.app.ActionBar.isShowing()' on a null object reference at com.myapplication.testing.activity.onResume(activity.java:774) at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1476) at android.app.Activity.performResume(Activity.java:8441) at android.app.ActivityThread.performResumeActivity(ActivityThread.java:5200) at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:5269) at android.app.servertransaction.ResumeActivityItem.execute(ResumeActivityItem.java:54) at android.app.servertransaction.ActivityTransactionItem.execute(ActivityTransactionItem.java:45) at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:176) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2438) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loopOnce(Looper.java:226) at android.os.Looper.loop(Looper.java:313) at android.app.ActivityThread.main(ActivityThread.java:8669) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:571) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1135)
相关代码(Activity的onResume方法片段)
boolean showActionBar = settings.getBoolean(Preferences.KEY_SHOW_ACTION_BAR, true); ActionBar bar = getActionBar(); if (showActionBar && (bar.isShowing() != showActionBar)) bar.show(); else if (!showActionBar && (bar.isShowing() != showActionBar)) bar.hide(); bannerView.getbannerBox().setActionBarReplacementVisible(!showActionBar); banneView.setOnbannerboxListener(this); banneView.setOnInputListener(this); updateUndoRedoIcons(); setKeepScreenOn(); banne.startInput(); }
配置文件
Project B(Library模块)的Manifest配置片段
<application android:allowBackup="true" android:hardwareAccelerated="true" android:icon="@drawable/icon_logo" android:roundIcon="@drawable/icon_logo" android:label="@string/app_name" android:largeHeap="true" android:theme="@style/AppTheme" tools:replace="android:label,android:icon,android:theme"> <activity android:exported="true" android:theme="@style/AppTheme.Splash" android:name=".Splash"> <intent-filter> <category android:name="android.intent.category.MULTIWINDOW_LAUNCHER" /> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="com.myapplication.testing.activity" android:label="@string/app_name" android:theme="@style/AppTheme"> </activity> ... </application>
Project A(主App)的Manifest配置片段
<application android:fullBackupContent="false" android:allowBackup="true" android:name="com.project.fullapp" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme" tools:replace="android:label,android:icon,android:theme"> <activity android:name="com.myapplication.testing.activity" android:label="@string/app_name"> </activity> ... </application>
解决方案
1. 立即修复空指针:给ActionBar加判空逻辑
崩溃的核心原因是getActionBar()返回了null,却直接调用了isShowing()方法。修改Activity代码,先判断ActionBar是否存在再执行操作:
boolean showActionBar = settings.getBoolean(Preferences.KEY_SHOW_ACTION_BAR, true); ActionBar bar = getActionBar(); // 先判空,避免空指针 if (bar != null) { if (showActionBar && !bar.isShowing()) { bar.show(); } else if (!showActionBar && bar.isShowing()) { bar.hide(); } } bannerView.getbannerBox().setActionBarReplacementVisible(!showActionBar); banneView.setOnbannerboxListener(this); banneView.setOnInputListener(this); updateUndoRedoIcons(); setKeepScreenOn(); banne.startInput(); }
2. 检查Activity的主题配置
主App的Manifest中,com.myapplication.testing.activity没有指定android:theme,会默认继承Application的主题。如果Application的主题是NoActionBar类型(比如Theme.Material.Light.NoActionBar),getActionBar()就会返回null。
修改主App的Manifest,给该Activity指定带ActionBar的主题:
<activity android:name="com.myapplication.testing.activity" android:label="@string/app_name" android:theme="@style/AppTheme"> <!-- 确保AppTheme是带ActionBar的主题 --> </activity>
同时检查@style/AppTheme的定义,确保它继承自带ActionBar的主题,比如:
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- 其他自定义属性 --> </style>
3. 切换为兼容式ActionBar调用(如果用了AppCompat库)
如果项目依赖了AppCompat库,推荐使用getSupportActionBar()替代getActionBar(),后者仅针对原生系统ActionBar,前者兼容AppCompat的Toolbar:
// 替换getActionBar()为getSupportActionBar() ActionBar bar = getSupportActionBar(); // 后续判空和操作逻辑不变
内容的提问来源于stack exchange,提问作者adam_p87
相关产品推荐
相关产品推荐

