我设置了以下代码,以便在Android上创建自定义RatingBar
样式:
在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>
在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>
在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>
在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似乎没有个别drawable的问题。但是,当我在xml布局中的RatingBar
中使用此样式时,RatingBar
(其默认样式没有任何问题)可以解决一些问题:
minHeight
和maxHeight
,则RatingBar
会拉伸到更大的高度,但仍然只有一个自定义星(圆圈) ListView
项目视图内,则项目视图本身不再可点击(项目视图可以使用默认样式进行点击)。这个设置中是否有我遗漏的东西?我直接从SDK中的默认RatingBar
样式复制drawables并交换我的值(这导致上面的代码),但它仍然无法正常工作。
布局中使用的片段:
<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就像一个0.5步的ProgressBar。因此,对于每个应该使用的星形而言,它不是使用drawable,而是使用drawable 一次作为整个RatingBar区域的背景。
是否有人知道如何制作它以便我可以简单地替换星形drawable并保留所有其他的RatingBar行为?
答案 0 :(得分:5)
我打开了你的测试项目并进行了一些试错调试。我的结论是你不能在RatingBar
中使用XML形状drawables作为progressDrawables。 Android平台RatingBar
drawables都是.png
个文件,这是一个非常好的指标,可能不支持XML drawable。我尝试在你的测试项目中使用位图drawables,它们运行良好。
你只有解决方案似乎是使用位图drawables,除非你可以找出你自己的RatingBar实现。
答案 1 :(得分:0)
解决这个问题很容易。您应该转到Gradle(模块:应用程序),并更改兼容性。替换为这个:
&#39; com.android.support:程序兼容性-V7:22.1.1&#39;
然后,替换MainActivity的ActionBarActivity扩展,因为不推荐使用此类。现在你必须使用AppCompatActivity。
在此处阅读更多内容:https://plus.google.com/+AndroidDevelopers/posts/LNyDnnBYJ8r