Android 某些设备上的膨胀错误导致强制关闭

Android inflating errors on some devices that causes force close

我正在开发一个 android 应用程序,我已经在 Android 7 上测试了这个应用程序,它运行良好。但最后我决定在较低版本上测试它并感到惊讶。 在开始一些活动时,我遇到了很多膨胀错误。 这是我的应用 gradle 文件:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 27
    defaultConfig {
        applicationId "x.x.x"
        minSdkVersion 17
        targetSdkVersion 27
        versionCode 0
        versionName "x"
        testInstrumentationRunner  "android.support.test.runner.AndroidJUnitRunner"
    vectorDrawables.useSupportLibrary = true
}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation 'com.android.support:appcompat-v7:27.1.1'
    implementation 'com.android.support.constraint:constraint-layout:1.1.2'
    implementation 'com.android.support:design:27.1.1'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    implementation 'com.skyfishjy.ripplebackground:library:1.0.1'
    implementation 'com.orhanobut:dialogplus:1.11@aar'
    implementation 'br.com.simplepass:loading-button-android:1.14.0'
    implementation 'com.squareup.retrofit2:retrofit:2.4.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
    implementation 'com.squareup.picasso:picasso:2.5.2'
    implementation 'com.github.traex.expandablelayout:library:1.3'
    implementation 'com.github.markomilos:paginate:0.5.1'
    implementation 'com.github.castorflex.smoothprogressbar:library:1.1.0'
    implementation 'id.zelory:compressor:2.1.0'
    implementation 'com.google.firebase:firebase-core:16.0.4'
}

这里只是 logcat 错误的一小部分 :

Process: com.x.x, PID: 8878
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.x.x/com.x.x.Tickets}: android.view.InflateException: Binary XML file line #97: Binary XML file line #97: Error inflating class android.support.design.widget.FloatingActionButton
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2421)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2481)
    at android.app.ActivityThread.access0(ActivityThread.java:155)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1349)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:174)
    at android.app.ActivityThread.main(ActivityThread.java:5440)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
 Caused by: android.view.InflateException: Binary XML file line #97: Binary XML file line #97: Error inflating class android.support.design.widget.FloatingActionButton
    at android.view.LayoutInflater.inflate(LayoutInflater.java:539)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:374)
    at android.support.v7.app.AppCompatDelegateImplV9.setContentView(AppCompatDelegateImplV9.java:287)
    at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:139)
    at com.x.x.Tickets.onCreate(Tickets.java:51)
    at android.app.Activity.performCreate(Activity.java:6285)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1108)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2374)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2481) 
    at android.app.ActivityThread.access0(ActivityThread.java:155) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1349) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:174) 
    at android.app.ActivityThread.main(ActivityThread.java:5440) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
 Caused by: android.view.InflateException: Binary XML file line #97: Error inflating class android.support.design.widget.FloatingActionButton
    at android.view.LayoutInflater.createView(LayoutInflater.java:645)
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:764)
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:835)
    at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:515)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:423) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:374) 
    at android.support.v7.app.AppCompatDelegateImplV9.setContentView(AppCompatDelegateImplV9.java:287) 
    at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:139) 
    at com.x.x.Tickets.onCreate(Tickets.java:51) 
    at android.app.Activity.performCreate(Activity.java:6285) 
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1108) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2374) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2481) 
    at android.app.ActivityThread.access0(ActivityThread.java:155) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1349) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:174) 
    at android.app.ActivityThread.main(ActivityThread.java:5440) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
 Caused by: java.lang.reflect.InvocationTargetException
    at java.lang.reflect.Constructor.newInstance(Native Method)
    at android.view.LayoutInflater.createView(LayoutInflater.java:619)
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:764) 
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704) 
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:835) 
    at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:515) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:423) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:374) 
    at android.support.v7.app.AppCompatDelegateImplV9.setContentView(AppCompatDelegateImplV9.java:287) 
    at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:139) 
    at com.x.x.Tickets.onCreate(Tickets.java:51) 
    at android.app.Activity.performCreate(Activity.java:6285) 
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1108) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2374) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2481) 
    at android.app.ActivityThread.access0(ActivityThread.java:155) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1349) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:174) 
    at android.app.ActivityThread.main(ActivityThread.java:5440) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable$ConstantState.newDrawable()' on a null object reference
    at android.graphics.drawable.LayerDrawable$ChildDrawable.<init>(LayerDrawable.java:1723)
    at android.graphics.drawable.LayerDrawable$LayerState.<init>(LayerDrawable.java:1792)
    at android.graphics.drawable.RippleDrawable$RippleState.<init>(RippleDrawable.java:998)
    at android.graphics.drawable.RippleDrawable.createConstantState(RippleDrawable.java:989)
    at android.graphics.drawable.RippleDrawable.createConstantState(RippleDrawable.java:96)
    at android.graphics.drawable.LayerDrawable.mutate(LayerDrawable.java:1652)
    at android.graphics.drawable.RippleDrawable.mutate(RippleDrawable.java:975)
    at android.view.View.applyBackgroundTint(View.java:17430)
    at android.view.View.setBackgroundDrawable(View.java:17306)
    at android.support.design.widget.FloatingActionButton.access[=12=]1(FloatingActionButton.java:69)
    at android.support.design.widget.FloatingActionButton$ShadowDelegateImpl.setBackgroundDrawable(FloatingActionButton.java:862)
    at android.support.design.widget.FloatingActionButtonLollipop.setBackgroundDrawable(FloatingActionButtonLollipop.java:73)
    at android.support.design.widget.FloatingActionButton.<init>(FloatingActionButton.java:188)
    at android.support.design.widget.FloatingActionButton.<init>(FloatingActionButton.j

这个项目在 android 7 上运行良好,但我在 android 4.2.2 和 6.0.1(可能还有其他设备)上遇到这些错误

这是我的 xml 文件:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout   xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:expandable="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".Tickets">

<android.support.design.widget.AppBarLayout
    android:id="@+id/ticketsAppBar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/primary_color"
    android:paddingTop="@dimen/appbar_padding_top"
    android:theme="@style/AppTheme.AppBarOverlay">

    <android.support.v7.widget.Toolbar
        android:id="@+id/ticketsDashboard_toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:contentInsetEnd="0dp"
        android:contentInsetLeft="0dp"
        android:contentInsetRight="0dp"
        android:contentInsetStart="0dp"
        app:contentInsetEnd="0dp"
        app:contentInsetLeft="0dp"
        app:contentInsetRight="0dp"
        app:contentInsetStart="0dp">

        <include android:id="@+id/ticketsBar" layout="@layout/others_toolbar"></include>

    </android.support.v7.widget.Toolbar>

</android.support.design.widget.AppBarLayout>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">


    <android.support.v7.widget.RecyclerView
        android:id="@+id/tickets_recycler_view"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:visibility="gone" />


    <fr.castorflex.android.smoothprogressbar.SmoothProgressBar xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/load_more_progressbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:indeterminate="true"
        android:visibility="gone"
        app:spb_color="@color/dark_primary"
        app:spb_mirror_mode="true"
        app:spb_progressiveStart_activated="true"
        app:spb_progressiveStart_speed="1.5"
        app:spb_progressiveStop_speed="3.4"
        app:spb_reversed="true"
        app:spb_sections_count="4"
        app:spb_speed="10.0"
        app:spb_stroke_separator_length="4dp"
        app:spb_stroke_width="4dp" />


</LinearLayout>

<ProgressBar
    android:id="@+id/tickets_progressBar"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_vertical|center_horizontal"
    android:layout_marginBottom="8dp"
    android:layout_marginEnd="8dp"
    android:layout_marginStart="8dp"
    android:layout_marginTop="8dp"
    android:background="@drawable/progress_bar" />

<ViewStub
    android:layout_gravity="center_vertical|center_horizontal"
    android:id="@+id/ticketsVS"
    android:layout_width="match_parent"
    android:layout_marginBottom="8dp"
    android:layout_marginEnd="8dp"
    android:layout_marginStart="8dp"
    android:layout_marginTop="8dp"
    android:layout_height="wrap_content" />

<android.support.design.widget.FloatingActionButton
    android:id="@+id/newTicketFAB"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom|right"
    android:layout_marginBottom="24dp"
    android:layout_marginEnd="16dp"
    android:backgroundTint="@color/secondry_text"
    android:clickable="true"
    app:rippleColor="@color/divider_color"
    expandable:srcCompat="@drawable/ic_add_black_24dp" />


</android.support.design.widget.CoordinatorLayout>

您的 FloatingActionButton 中有一个属性 android:backgroundTint,根据 View.setBackgroundTintList,它仅在 Android API 21 及更高版本中可用,这就是您在 API 级别较低的设备上遇到崩溃的原因。要修复向后兼容性问题,请尝试将属性替换为 app:backgroundTint:

<android.support.design.widget.FloatingActionButton
    android:id="@+id/newTicketFAB"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom|right"
    android:layout_marginBottom="24dp"
    android:layout_marginEnd="16dp"
    android:clickable="true"
    app:backgroundTint="@color/secondry_text"
    app:rippleColor="@color/divider_color"
    app:srcCompat="@drawable/ic_add_black_24dp" />