【问题标题】:Animated-selector causes crash on view initialization动画选择器导致视图初始化崩溃
【发布时间】:2019-07-12 11:24:03
【问题描述】:

我的目标是创建一个自定义开关,包括选中和未选中状态之间的动画转换。

我轻松实现了默认状态,并且我的开关在两种状态下看起来都符合预期,并且当状态改变时它的外观也会改变。

当我附加动画选择器而不是常规选择器时会出现问题。

我收到这样的错误:

android.view.InflateException:二进制 XML 文件第 10 行:二进制 XML 文件第 10 行:膨胀类 android.widget.Switch 时出错

原因:android.content.res.Resources$NotFoundException:文件 res/drawable/switch_track_animation_unchecked_checked.xml 来自 可绘制资源 ID #0x7f060072 在 android.content.res.Resources.loadDrawableForCookie(Resources.java:2640)

原因:android.content.res.Resources$NotFoundException:文件 res/drawable/switch_track_animated_selector.xml 来自可绘制资源 ID #0x7f060070

我可以确保我可以正确访问这些可绘制对象等。

我经历了无效缓存并重新启动、清理构建、重建等,但它不起作用。

查看示例

<Switch
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:thumb="@drawable/switch_thumb_selector"
            android:track="@drawable/switch_track_animated_selector"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            android:checked="true"
            android:id="@+id/switch2"/>

switch_track_animated_selector

<animated-selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/checked"
          android:drawable="@drawable/switch_bckg_on"
          android:state_checked="true"/>

    <item android:id="@+id/unchecked"
          android:drawable="@drawable/switch_bckg_off"
          android:state_checked="false"/>

    <transition
            android:fromId="@+id/unchecked"
            android:toId="@+id/checked"
            android:drawable="@drawable/switch_track_animation_unchecked_checked"/>

    <transition
            android:fromId="@+id/checked"
            android:toId="@+id/unchecked"
            android:drawable="@drawable/switch_track_animation_checked_unchecked"/>
</animated-selector>

switch_bckg_on.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#00B05A"/>
    <stroke android:width="1dp" android:color="#00B05A" />
    <corners android:radius="180dp"/>
    <padding android:left="0dp" android:top="0dp" android:right="0dp" android:bottom="0dp" />
</shape>

switch_bckg_off.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#F1F1F1"/>
    <stroke android:width="1dp" android:color="#E0E0E0" />
    <corners android:radius="180dp"/>
    <padding android:left="0dp" android:top="0dp" android:right="0dp" android:bottom="0dp" />
</shape>

switch_track_animation_checked_unchecked.xml

<?xml version="1.0" encoding="utf-8"?>
<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
                 xmlns:aapt="http://schemas.android.com/aapt"
                 android:drawable="@drawable/switch_bckg_on">
    <target android:name="android:drawable">
        <aapt:attr name="android:animation">
            <objectAnimator
                    android:duration="@android:integer/config_shortAnimTime"
                    android:interpolator="@android:interpolator/accelerate_decelerate"
                    android:propertyName="strokeColor"
                    android:valueFrom="#A0A0A0"
                    android:valueTo="#1E9618"
                    android:valueType="intType" />
        </aapt:attr>
    </target>
</animated-vector>

switch_track_animation_unchecked_checked.xml

<?xml version="1.0" encoding="utf-8"?>
<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
                 xmlns:aapt="http://schemas.android.com/aapt"
                 android:drawable="@drawable/switch_bckg_off">
    <target android:name="android:drawable">
        <aapt:attr name="android:animation">
            <objectAnimator
                    android:duration="@android:integer/config_shortAnimTime"
                    android:interpolator="@android:interpolator/accelerate_decelerate"
                    android:propertyName="strokeColor"
                    android:valueFrom="#A0A0A0"
                    android:valueTo="#1E9618"
                    android:valueType="intType"/>
        </aapt:attr>
    </target>
</animated-vector>

我还使用矢量可绘制而不是形状检查了上述方法,并且得到了相同的结果。 向量示例

ic_thumb_vector_off

<vector android:height="33dp" android:viewportHeight="300"
    android:viewportWidth="300" android:width="33dp" xmlns:android="http://schemas.android.com/apk/res/android">
    <path android:name="background_off" android:fillColor="#FFFFFF" android:fillType="nonZero"
        android:pathData="M149.926,149.926m-149.176,0a149.176,149.176 0,1 1,298.352 0a149.176,149.176 0,1 1,-298.352 0"
        android:strokeAlpha="0.1" android:strokeColor="#000000" android:strokeWidth="0.5"/>
    <path android:name="icon_off" android:fillColor="#9B9B9B" android:fillType="evenOdd"
        android:pathData="M166.88,146.104C166.13,145.354 166.13,144.228 166.88,143.478L195.019,115.339C195.77,114.588 196.145,113.463 196.145,112.712C196.145,111.962 195.77,110.836 195.019,110.086L189.767,104.833C189.016,104.083 187.891,103.708 187.14,103.708C186.015,103.708 185.264,104.083 184.514,104.833L156.375,132.972C155.624,133.723 154.499,133.723 153.748,132.972L125.609,104.833C124.859,104.083 123.733,103.708 122.983,103.708C122.233,103.708 121.107,104.083 120.357,104.833L115.104,110.086C114.354,110.836 113.979,111.962 113.979,112.712C113.979,113.463 114.354,114.588 115.104,115.339L143.243,143.478C143.994,144.228 143.994,145.354 143.243,146.104L115.104,174.243C114.354,174.993 113.979,176.119 113.979,176.869C113.979,177.62 114.354,178.745 115.104,179.496L120.357,184.748C121.107,185.499 122.233,185.874 122.983,185.874C123.733,185.874 124.859,185.499 125.609,184.748L153.748,156.609C154.499,155.859 155.624,155.859 156.375,156.609L184.514,184.748C185.264,185.499 186.39,185.874 187.14,185.874C187.891,185.874 189.016,185.499 189.767,184.748L195.019,179.496C195.77,178.745 196.145,177.62 196.145,176.869C196.145,176.119 195.77,174.993 195.019,174.243L166.88,146.104Z"
        android:strokeColor="#00000000" android:strokeWidth="1"/>
</vector>

ic_thumb_vector_on

<vector android:height="33dp" android:viewportHeight="302"
    android:viewportWidth="302" android:width="33dp" xmlns:android="http://schemas.android.com/apk/res/android">
    <path android:name="background_on" android:fillColor="#FFFFFF" android:fillType="nonZero"
        android:pathData="M151,151m-150.25,0a150.25,150.25 0,1 1,300.5 0a150.25,150.25 0,1 1,-300.5 0"
        android:strokeAlpha="0.1" android:strokeColor="#000000" android:strokeWidth="0.5"/>
    <path android:name="icon_on" android:fillColor="#00B05A" android:fillType="evenOdd"
        android:pathData="M105.523,153.198C104.806,152.5 104.448,151.453 104.448,150.754C104.448,150.056 104.806,149.009 105.523,148.31L110.536,143.422C111.968,142.026 114.117,142.026 115.549,143.422L115.907,143.772L135.602,164.371C136.318,165.069 137.393,165.069 138.109,164.371L186.093,115.841L186.451,115.841C187.883,114.444 190.032,114.444 191.464,115.841L196.477,120.728C197.91,122.125 197.91,124.22 196.477,125.616L139.183,183.573C138.467,184.272 137.751,184.621 136.676,184.621C135.602,184.621 134.886,184.272 134.17,183.573L106.239,154.246L105.523,153.198Z"
        android:strokeColor="#00000000" android:strokeWidth="1"/>
</vector>

也许我/我在 gradle 文件中遗漏了什么?

apply plugin: 'com.android.application'

apply plugin: 'kotlin-android'

apply plugin: 'kotlin-android-extensions'

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "...customswitch"
        minSdkVersion 22
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'androidx.appcompat:appcompat:1.0.2'
    implementation 'androidx.core:core-ktx:1.0.2'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test:runner:1.2.0'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}

我希望这个视图能够加载并且不会在视图初始化时抛出错误。

【问题讨论】:

    标签: android-studio kotlin


    【解决方案1】:

    您的问题是switch_track_animation_unchecked_checked.xmlswitch_track_animation_checked_unchecked.xml 是动画VectorDrawables,而这些动画静态VectorDrawable 状态。您正在尝试为ShapeDrawable 设置动画,而不是VectorDrawable,我认为这就是导致异常的原因。

    您需要将 switch_bckg_on.xmlswitch_bckg_off.xml 替换为 &lt;vector&gt;...&lt;/vector&gt; 实现,以便在 &lt;animated-vector&gt;...&lt;/animated-vector&gt; 块内为它们设置动画。

    或者,您可以将 AnimatedVectorDrawables 替换为 StateListAnimator,尽管我不确定它是否真的能够完成您在此处尝试实现的目标。

    【讨论】:

    • 您好,感谢您的回复。我在使用矢量绘图时遇到了同样的问题。我会更新我的问题,以便您可以看到这些向量。但这并没有帮助。
    【解决方案2】:

    您的 switch_track_animated_selector 似乎没有一些没有任何 id 的 default 状态。您可以尝试添加此状态。这在类似的情况下帮助了我

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多