自定义RatingBar样式只显示一个点,其他奇怪的行为

时间:2014-12-02 14:18:10

标签: android android-layout android-drawable android-styles ratingbar

我设置了以下代码,以便在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.pngres/drawable/button_disabled.png,我想用它来代替RatingBar上的星星。

Android Studio似乎没有个别dr​​awable的问题。但是,当我在xml布局中的RatingBar中使用此样式时,RatingBar(其默认样式没有任何问题)可以解决一些问题:

  1. 不管可设置的星数是多少,我都只看一个,而不管星数的数量是多少。
  2. 如果我没有在样式中设置minHeightmaxHeight,则RatingBar会拉伸到更大的高度,但仍然只有一个自定义星(圆圈)
  3. 如果放在ListView项目视图内,则项目视图本身不再可点击(项目视图可以使用默认样式进行点击)。
  4. 这个设置中是否有我遗漏的东西?我直接从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行为?

2 个答案:

答案 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