Невозможно использовать LayerDrawable больше (после обновления 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$1.run(FragmentManager.java:458)
            at android.os.Handler.handleCallback(Handler.java:725)

Я тестирую Android 4.2.2. Любые подсказки и обходные пути?

Ответ 1

Я узнал, что 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+

Ответ 2

У меня такая же проблема. Я искал его и обнаружил, что если мы напишем

<RatingBar
android:layout_width="wrap_content"
android:numStars="5"
android:layout_height="wrap_content"
/>

в файле XML. Than, 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"
    />

Ответ 3

Пожалуйста, попробуйте это для заданного цвета индикатора прогресса

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

Ответ 4

Когда вы используете библиотеки AppCompat, многие из ваших стилей не должны включать андроид:, поэтому приведенный выше код имеет следующий формат:

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

<!-- Support library compatibility -->
<item name="ratingBarStyle">@style/myRatingBarStyle</item> 
···

В принципе, вам нужно стилизовать для V21.1 и выше и для совместимости, если вы ставите несколько объектов.