【问题标题】:Cannot cast to LayerDrawable anymore (after upgrading v7)无法再转换为 LayerDrawable(升级 v7 后)
【发布时间】:2016-05-03 15:53:10
【问题描述】:

我正在使用支持库的最新版本,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$1.run(FragmentManager.java:458)
            at android.os.Handler.handleCallback(Handler.java:725)

我正在 Android 4.2.2 上进行测试。任何提示和解决方法?

【问题讨论】:

    标签: android android-support-library android-appcompat


    【解决方案1】:

    我遇到了同样的问题。我搜索了一下,发现,如果我们写

    <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"
        />
    

    【讨论】:

      【解决方案2】:

      我发现getProgressDrawable() 不再返回我的LayerDrawable

      我正在通过样式设置LayerDrawable 背景,其中:

      <item name="android:ratingBarStyle">@style/myRatingBarStyle</item>
      

      由于 v21.1 添加了RatingBarAppCompatRatingBar 的色调感知版本,它们现在从ratingBarStyle 读取属性,而不是android:ratingBarStyle。所以我不得不将上面的行替换为:

      <item name="ratingBarStyle">@style/myRatingBarStyle</item>
      <item name="android:ratingBarStyle">@style/myRatingBarStyle</item> //API21+
      

      【讨论】:

      • 什么是 myRatingBarStyle ?请填写你的答案
      【解决方案3】:

      请试试这个设置进度条的颜色

      DrawableCompat.setTint(ratingBar.getProgressDrawable(),color);

      【讨论】:

        【解决方案4】:

        当您使用 AppCompat 库时,您的许多样式都不必包含 android:,因此上面的代码具有以下格式:

        <!-- Customize your theme here. -->
        <item name="android:ratingBarStyle">@style/myRatingBarStyle</item>
        ···
        
        <!-- Support library compatibility -->
        <item name="ratingBarStyle">@style/myRatingBarStyle</item> 
        ···
        

        如果您要为多个对象设置样式,则基本上您需要为 V21.1 及更高版本设置样式以及为了兼容性。

        【讨论】:

          猜你喜欢
          • 2016-05-04
          • 1970-01-01
          • 2015-12-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多