Android 5.0(Lollipop)上CollapsingToolbarLayout致应用崩溃求助
问题排查与解决方案
问题描述
应用在Android 5.0(Lollipop)模拟器运行时崩溃,怀疑和CollapsingToolbarLayout有关,但模拟器无报错提示。相关代码如下:
布局XML代码
<androidx.coordinatorlayout.widget.CoordinatorLayout 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="match_parent" <com.google.android.material.appbar.AppBarLayout android:id="@+id/appbar" android:layout_width="match_parent" app:liftOnScroll="true" android:layout_height="wrap_content" android:theme="@style/ThemeOverlay.MaterialComponents.Dark.ActionBar" <com.google.android.material.appbar.CollapsingToolbarLayout android:id="@+id/collapsingToolbar" android:layout_width="match_parent" android:layout_height="wrap_content" app:contentScrim="@android:color/holo_purple" app:layout_scrollFlags="scroll|exitUntilCollapsed" <ImageView android:id="@+id/expandedImage" android:layout_width="match_parent" android:layout_height="200dp" android:scaleType="centerCrop" android:src="@drawable/mindorks_logo" app:layout_collapseMode="parallax" app:layout_collapseParallaxMultiplier="0.7" /> <androidx.appcompat.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" app:layout_collapseMode="pin" app:title="Hello World" /> </com.google.android.material.appbar.CollapsingToolbarLayout> </com.google.android.material.appbar.AppBarLayout> <androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior" <androidx.recyclerview.widget.RecyclerView android:id="@+id/recyclerLessons" android:layout_width="match_parent" android:layout_height="match_parent" /> </androidx.constraintlayout.widget.ConstraintLayout> </androidx.coordinatorlayout.widget.CoordinatorLayout>
Gradle配置代码
plugins { id 'com.android.application' id 'org.jetbrains.kotlin.android' id 'kotlin-kapt' id 'kotlin-android' id 'kotlin-parcelize' id("dagger.hilt.android.plugin") id 'com.google.dagger.hilt.android' } android { compileSdk 33 defaultConfig { applicationId "ir.mou.languageteaching" minSdk 21 targetSdk 33 versionCode 1 versionName "1.0" vectorDrawables.useSupportLibrary = true testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner' multiDexEnabled true buildConfigField("String", "wstoken", wstoken) buildConfigField("String", "wsfunction", wsfunction) buildConfigField("String", "moodlewsrestformat", moodlewsrestformat) buildConfigField("String", "service", service) } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = '1.8' } buildFeatures { viewBinding true } packagingOptions { resources { excludes += '/META-INF/{AL2.0,LGPL2.1}' } } namespace 'ir.mou.languageteaching' } ext { lifecycle_version = "2.6.0-alpha03" nav_version = "2.5.3" paging_version = "3.1.1" roomVersion = "2.5.0-beta02" work_version = "2.7.1" } dependencies { ///Compose/// implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.6.0-alpha03' implementation 'androidx.appcompat:appcompat:1.5.1' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' implementation 'androidx.vectordrawable:vectordrawable:1.1.0' implementation 'com.google.android.material:material:1.7.0' testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.4' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.0' // Futures implementation("androidx.concurrent:concurrent-futures-ktx:1.1.0") // Lifecycle components // ViewModel implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:${lifecycle_version}") // LiveData implementation("androidx.lifecycle:lifecycle-livedata-ktx:${lifecycle_version}") // Lifecycles only (without ViewModel or LiveData) implementation("androidx.lifecycle:lifecycle-runtime-ktx:${lifecycle_version}") // Saved state module for ViewModel implementation("androidx.lifecycle:lifecycle-viewmodel-savedstate:${lifecycle_version}") // optional - helpers for implementing LifecycleOwner in a Service implementation("androidx.lifecycle:lifecycle-service:${lifecycle_version}") // optional - ProcessLifecycleOwner provides a lifecycle for the whole application process implementation("androidx.lifecycle:lifecycle-process:${lifecycle_version}") // optional - ReactiveStreams support for LiveData implementation("androidx.lifecycle:lifecycle-reactivestreams-ktx:${lifecycle_version}") // Navigation // Kotlin implementation("androidx.navigation:navigation-fragment-ktx:${nav_version}") implementation("androidx.navigation:navigation-ui-ktx:${nav_version}") // Feature module Support implementation("androidx.navigation:navigation-dynamic-features-fragment:${nav_version}") // Paging implementation("androidx.paging:paging-runtime-ktx:${paging_version}") // alternatively - without Android dependencies for tests testImplementation("androidx.paging:paging-common-ktx:${paging_version}") // optional - RxJava2 support implementation("androidx.paging:paging-rxjava2-ktx:${paging_version}") // optional - RxJava3 support implementation("androidx.paging:paging-rxjava3:${paging_version}") // optional - Guava ListenableFuture support implementation("androidx.paging:paging-guava:${paging_version}") //Room implementation("androidx.room:room-runtime:${roomVersion}") annotationProcessor("androidx.room:room-compiler:${roomVersion}") // To use Kotlin annotation processing tool (kapt) kapt("androidx.room:room-compiler:${roomVersion}") // optional - Kotlin Extensions and Coroutines support for Room implementation("androidx.room:room-ktx:${roomVersion}") // optional - RxJava2 support for Room implementation("androidx.room:room-rxjava2:${roomVersion}") // optional - RxJava3 support for Room implementation("androidx.room:room-rxjava3:${roomVersion}") // optional - Guava support for Room, including Optional and ListenableFuture implementation("androidx.room:room-guava:${roomVersion}") // optional - Paging 3 Integration implementation("androidx.room:room-paging:2.5.0-beta02") // WorkManager // Kotlin + coroutines implementation("androidx.work:work-runtime-ktx:${work_version}") // optional - RxJava2 support implementation("androidx.work:work-rxjava2:${work_version}") // optional - GCMNetworkManager support implementation("androidx.work:work-gcm:${work_version}") // optional - Multiprocess support implementation "androidx.work:work-multiprocess:${work_version}" //Retrofit implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0' //Dagger implementation 'com.google.dagger:dagger:2.44.2' implementation 'com.google.dagger:dagger-android:2.44.2' kapt 'com.google.dagger:dagger-compiler:2.44.2' kapt 'com.google.dagger:dagger-android-processor:2.44.2' implementation('com.google.dagger:hilt-android:2.44.2') kapt('com.google.dagger:hilt-android-compiler:2.44.2') implementation 'androidx.recyclerview:recyclerview:1.2.1' implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4") implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4") implementation 'com.github.bumptech.glide:glide:4.14.2' annotationProcessor 'com.github.bumptech.glide:compiler:4.14.2' implementation 'com.google.android.material:material:1.7.0' implementation 'com.github.azhon:AppUpdate:4.1.1' implementation 'com.github.dhaval2404:imagepicker:2.1' implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0' // define a BOM and its version implementation(platform('com.squareup.okhttp3:okhttp-bom:5.0.0-alpha.10')) // define any required OkHttp artifacts without version implementation('com.squareup.okhttp3:okhttp:5.0.0-alpha.10') implementation('com.squareup.okhttp3:logging-interceptor:5.0.0-alpha.10') implementation "androidx.datastore:datastore-preferences:1.0.0" implementation 'androidx.core:core-splashscreen:1.0.0' implementation 'androidx.multidex:multidex:2.0.1' } // Allow references to generated code kapt { correctErrorTypes = true }
问题分析与修复方案
1. XML布局语法错误(最直接的崩溃原因)
你的布局XML中多个核心标签未正确闭合,这会直接导致布局加载失败(InflateException),在Android 5.0这类低版本系统中可能直接崩溃且无明确提示:
CoordinatorLayout标签末尾需补充>:<androidx.coordinatorlayout.widget.CoordinatorLayout 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="match_parent">AppBarLayout标签末尾需补充>:<com.google.android.material.appbar.AppBarLayout android:id="@+id/appbar" android:layout_width="match_parent" app:liftOnScroll="true" android:layout_height="wrap_content" android:theme="@style/ThemeOverlay.MaterialComponents.Dark.ActionBar">CollapsingToolbarLayout和ConstraintLayout标签同样缺少闭合的>,需逐一补充完整。
2. Material组件版本兼容性问题
你使用的com.google.android.material:material:1.7.0虽然官方标注最低支持API21,但部分特性(比如app:liftOnScroll="true")在Android 5.0上可能存在兼容性问题。建议:
- 暂时移除
app:liftOnScroll="true"属性,测试是否还崩溃; - 或者将Material组件版本降级到更稳定的1.6.1版本,该版本对低版本系统兼容性更好。
3. OkHttp Alpha版本不稳定
你引入了OkHttp 5.0.0-alpha.10,这是未稳定的测试版本,对Android 5.0的支持存在不确定性。建议降级到OkHttp 4.x稳定版本,比如4.10.0:
// 移除原OkHttp 5的BOM和依赖,替换为: implementation 'com.squareup.okhttp3:okhttp:4.10.0' implementation 'com.squareup.okhttp3:logging-interceptor:4.10.0'
4. 查看崩溃日志定位根源
模拟器未显示报错,但可以通过Android Studio的Logcat面板查看具体崩溃信息:
- 过滤
Error级别日志; - 搜索
AndroidRuntime关键词,找到崩溃堆栈,确认具体异常类型,这能精准定位后续潜在问题。
内容的提问来源于stack exchange,提问作者jo jo
相关产品推荐
相关产品推荐

