You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 00:05:21