У меня есть следующий код, настроенный для создания пользовательского стиля RatingBar
на Android:
In res/values/styles.xml
:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="MyRatingBar" parent="@android:style/Widget.RatingBar">
<item name="android:minHeight">@dimen/rating_bar_height</item>
<item name="android:maxHeight">@dimen/rating_bar_height</item>
<item name="android:progressDrawable">@drawable/circle_ratingbar_full</item>
</style>
</resources>
In res/drawable/circle_ratingbar_full.xml
:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@android:id/background"
android:drawable="@drawable/circle_ratingbar_full_empty" />
<item
android:id="@android:id/secondaryProgress"
android:drawable="@drawable/circle_ratingbar_full_empty" />
<item
android:id="@android:id/progress"
android:drawable="@drawable/circle_ratingbar_full_filled" />
</layer-list>
In res/drawable/circle_ratingbar_full_empty.xml
:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true"
android:state_window_focused="true"
android:drawable="@drawable/button_disabled" />
<item android:state_focused="true"
android:state_window_focused="true"
android:drawable="@drawable/button_disabled" />
<item android:state_selected="true"
android:state_window_focused="true"
android:drawable="@drawable/button_enabled" />
<item android:drawable="@drawable/button_disabled" />
</selector>
In res/drawable/circle_ratingbar_full_filled.xml
:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true"
android:state_window_focused="true"
android:drawable="@drawable/button_enabled" />
<item android:state_focused="true"
android:state_window_focused="true"
android:drawable="@drawable/button_enabled" />
<item android:state_selected="true"
android:state_window_focused="true"
android:drawable="@drawable/button_enabled" />
<item android:drawable="@drawable/button_enabled" />
</selector>
Кроме того, у меня есть два изображения, res/drawable/button_enabled.png
и res/drawable/button_disabled.png
, которые я хочу использовать для замены звездочек на RatingBar
.
У Android Studio, похоже, нет проблем с отдельными чертежами. Однако, когда я использую этот стиль в RatingBar
в макете xml, RatingBar
, который в своем стиле по умолчанию работает без проблем, имеет несколько проблем:
- Вместо переменного количества рисунков рейтинга я вижу только один, вне зависимости от количества выставленных звезд.
- Если я не установлю
minHeight
иmaxHeight
в стиле,RatingBar
растянется на большую высоту, но все равно будет только одна пользовательская звезда (круг). - Если его поместить внутрь представления элемента
ListView
, само представление элемента больше не будет кликабельным (представление элемента кликабельно со стилями по умолчанию).
Есть ли что-то, чего мне не хватает в этой настройке? Я прибегнул к копированию рисунков прямо из стилей RatingBar
по умолчанию в SDK и замене своих значений (что приводит к приведенному выше коду), и это все еще не работает.
Фрагмент использования в макете:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/accessory_view">
<LinearLayout
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:id="@+id/rating_min_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="Min Value"
android:paddingLeft="5dp"/>
<TextView
android:id="@+id/rating_max_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="Max Value"
android:paddingLeft="5dp"/>
</LinearLayout>
<RatingBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:id="@+id/rating"
style="@style/MyRatingBar"
android:stepSize="1.0"/>
</LinearLayout>
ОБНОВЛЕНИЕ
После дальнейшего тестирования я обнаружил, что щелчок по любой части одиночной точки, которую я вижу, фактически изменит рейтинг на значение, соответствующее где я щелкнул по нему. Таким образом, кажется, что RatingBar действует как ProgressBar с шагом 0,5. Таким образом, вместо того, чтобы использовать один раз для каждой звезды, он, кажется, использует рисуемый once в качестве фона всей области RatingBar.
Кто-нибудь знает, как сделать так, чтобы я мог просто заменить звездочки и сохранить все остальное поведение RatingBar?