无法再转换为 LayerDrawable(升级 v7 后)
Cannot cast to LayerDrawable anymore (after upgrading v7)
我使用的是最新版本的支持库,22.1.1。
我以前是这样的:
mRatingBar = (RatingBar) getActivity().findViewById(R.id.rating);
LayerDrawable layer = (LayerDrawable) mRatingBar.getProgressDrawable();
但升级后它在第 2 行崩溃并显示 ClassCastException
:
android.support.v4.graphics.drawable.DrawableWrapperHoneycomb cannot be cast to android.graphics.drawable.LayerDrawable
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:973)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1138)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:740)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1501)
at android.support.v4.app.FragmentManagerImpl.run(FragmentManager.java:458)
at android.os.Handler.handleCallback(Handler.java:725)
我正在 Android 4.2.2 上进行测试。任何提示和解决方法?
我发现 getProgressDrawable()
不再返回我的 LayerDrawable
。
我正在通过样式设置 LayerDrawable
背景,其中:
<item name="android:ratingBarStyle">@style/myRatingBarStyle</item>
自从 v21.1 添加了 RatingBar
、AppCompatRatingBar
的色调感知版本后,他们现在从 ratingBarStyle
而不是 android:ratingBarStyle
读取属性。所以我不得不将上面的行替换为:
<item name="ratingBarStyle">@style/myRatingBarStyle</item>
<item name="android:ratingBarStyle">@style/myRatingBarStyle</item> //API21+
当您使用 AppCompat 库时,您的许多样式不必包含 android:,因此上面的代码具有以下格式:
<!-- Customize your theme here. -->
<item name="android:ratingBarStyle">@style/myRatingBarStyle</item>
···
<!-- Support library compatibility -->
<item name="ratingBarStyle">@style/myRatingBarStyle</item>
···
基本上,如果您要为多个对象设置样式,则需要为 V21.1 及更高版本设置样式并实现兼容性。
请尝试这个来设置进度条的颜色
DrawableCompat.setTint(ratingBar.getProgressDrawable(),color);
我遇到了同样的问题。我搜索了一下发现,如果我们写
<RatingBar
android:layout_width="wrap_content"
android:numStars="5"
android:layout_height="wrap_content"
/>
在 XML 文件中。然后,Android 默认将 RatingBar 转换为 android.support.v7.widget.AppCompatRatingBar 而不是 android.widget.RatingBar.
只需使用以下代码修改您的代码,问题就会得到解决。
<android.widget.RatingBar
android:layout_width="wrap_content"
android:numStars="5"
android:layout_height="wrap_content"
/>
我使用的是最新版本的支持库,22.1.1。
我以前是这样的:
mRatingBar = (RatingBar) getActivity().findViewById(R.id.rating);
LayerDrawable layer = (LayerDrawable) mRatingBar.getProgressDrawable();
但升级后它在第 2 行崩溃并显示 ClassCastException
:
android.support.v4.graphics.drawable.DrawableWrapperHoneycomb cannot be cast to android.graphics.drawable.LayerDrawable
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:973)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1138)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:740)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1501)
at android.support.v4.app.FragmentManagerImpl.run(FragmentManager.java:458)
at android.os.Handler.handleCallback(Handler.java:725)
我正在 Android 4.2.2 上进行测试。任何提示和解决方法?
我发现 getProgressDrawable()
不再返回我的 LayerDrawable
。
我正在通过样式设置 LayerDrawable
背景,其中:
<item name="android:ratingBarStyle">@style/myRatingBarStyle</item>
自从 v21.1 添加了 RatingBar
、AppCompatRatingBar
的色调感知版本后,他们现在从 ratingBarStyle
而不是 android:ratingBarStyle
读取属性。所以我不得不将上面的行替换为:
<item name="ratingBarStyle">@style/myRatingBarStyle</item>
<item name="android:ratingBarStyle">@style/myRatingBarStyle</item> //API21+
当您使用 AppCompat 库时,您的许多样式不必包含 android:,因此上面的代码具有以下格式:
<!-- Customize your theme here. -->
<item name="android:ratingBarStyle">@style/myRatingBarStyle</item>
···
<!-- Support library compatibility -->
<item name="ratingBarStyle">@style/myRatingBarStyle</item>
···
基本上,如果您要为多个对象设置样式,则需要为 V21.1 及更高版本设置样式并实现兼容性。
请尝试这个来设置进度条的颜色
DrawableCompat.setTint(ratingBar.getProgressDrawable(),color);
我遇到了同样的问题。我搜索了一下发现,如果我们写
<RatingBar
android:layout_width="wrap_content"
android:numStars="5"
android:layout_height="wrap_content"
/>
在 XML 文件中。然后,Android 默认将 RatingBar 转换为 android.support.v7.widget.AppCompatRatingBar 而不是 android.widget.RatingBar.
只需使用以下代码修改您的代码,问题就会得到解决。
<android.widget.RatingBar
android:layout_width="wrap_content"
android:numStars="5"
android:layout_height="wrap_content"
/>