如何使RatingBar显示五颗星


98

我正在遵循如何添加的标准示例RatingBar。为了控制我尝试使用的星星数量android:numStars="5"。问题在于星星的数量似乎根本没有任何作用。在纵向布局中,我得到6星,当我翻转手机时,我得到大约10星。我尝试在我的Activity(myBar.setNumStars(5))中设置加载xml 的星星数,但是该选项也没有成功。

所以我的问题是如何定义布局,使其仅显示五颗星?Set numStars似乎不起作用。

预先感谢,罗兰

Answers:


180
<RatingBar
            android:id="@+id/rating"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            style="?android:attr/ratingBarStyleSmall"
            android:numStars="5"
            android:stepSize="0.1"
            android:isIndicator="true" />

在代码中

mRatingBar.setRating(int)

120
感谢您的回答。问题是您不能使用android:layout_width =“ fill_parent”,因为RatingBar程序完全忽略了android:numStars其他视图。:-/
罗兰2010年

3
我的要求是设置等级栏以填充父级或匹配父级,但固定星号,即5.如何做到?可能吗?
Prashanth Debbadwar

@PrashanthDebbadwar您是否在“样式”属性中尝试了3种不同的尺寸?例如ratingBarStyle
M. Usman Khan

65

RatingBar.setNumStar文档说:

设置要显示的星星数。为了正确显示这些内容,建议此小部件的布局宽度为自动换行内容。

因此,将布局宽度设置为wrap_content应该可以解决此问题。


25

这对我有用:RatingBar应该在内部,LinearLayout而不是设置布局宽度来包装的内容RatingBar


1
@ValentinGalea并不是很奇怪:评分栏会考虑其自身的宽度,而外部LinearLayout则关心填充其父布局的宽度。
TechNyquist 2014年

13

此外,如果您设置了layout_weight,则该numStars属性将取代该属性。


2
这确实应该在文档中。我发现,即使添加保证金权利设置也会抛出numStars
Anton I. Sipos

这是个好建议。我删除了填充物,最后使其对我有效。
Tha Leang


6

如果您正在使用

android:layout_width="match_parent"

使用wrap_content,它将仅显示设置的numStars :)

android:layout_width="wrap_content"


5
<RatingBar
                    android:id="@+id/ratingBar"
                    style="@style/custom_rating_bar"
                    android:layout_width="wrap_content"
                    android:layout_height="35dp"
                    android:clickable="true"
                    android:numStars="5" 
                    />

在XML文件中配置星标的数量...无需在样式或活动/片段中提供它。


5

我还面临着一个问题,就是超出星号而不是指定的星数。为此,我们不想担心相对或线性布局的任何布局类型。只需使用以下宽度:

ratingBar.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));


避免ratingbar使用match_parent和fill_parent
希望事情会有所帮助。


3

即使我遇到了@Roland问题,我也添加了一个名为

android:layout_alignParentRight="true" 

在我RatingBar的XML声明中。此属性阻止设置所需的星星并设置NumStars

随时发布遇到的问题!


只是帮助了一个朋友做同样的事情。我提出了这种方法,后来发现它是无效的。
AdamMc331

3

对我来说,在删除填充之前我一直遇到问题。在某些设备上似乎存在一个错误,该错误不会更改视图的大小以适应填充,而是会压缩内容。

删除paddinglayout_margin改为使用。


1

要以圆形显示简单的星级,只需使用此代码

public static String getIntToStar(int starCount) {
        String fillStar = "\u2605";
        String blankStar = "\u2606";
        String star = "";

        for (int i = 0; i < starCount; i++) {
            star = star.concat(" " + fillStar);
        }
        for (int j = (5 - starCount); j > 0; j--) {
            star = star.concat(" " + blankStar);
        }
        return star;
    }

像这样使用

button.setText(getIntToStar(4));


1

您可以在xml布局的旁边添加五颗星的默认评分

android:rating="5"

编辑:

<RatingBar
        android:id="@+id/rb_vvm"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_marginBottom="@dimen/space2"
        android:layout_marginTop="@dimen/space1"
        style="@style/RatingBar"
        android:numStars="5"
        android:stepSize="1"
        android:rating="5" />

请通过示例说明如何将其添加到xml布局。
Kurt Van den Branden

我已经添加了完整的视图。
Gaurav Shetty

1

如果您要包装RatingBar里面的ConstraintLayoutmatch_constraint宽度在一起,则无论您设置android:numStars属性如何,编辑器预览将显示与实际宽度成比例的星形。使用wrap_content以获得正确的预览:

<RatingBar android:id="@+id/myRatingBar"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:layout_marginStart="48dp"
           android:layout_marginEnd="48dp"
           android:numStars="5"
           app:layout_constraintEnd_toEndOf="parent"
           app:layout_constraintStart_toStartOf="parent"
           app:layout_constraintTop_toBottomOf="parent" />


0
<LinearLayout 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" >

    <RatingBar
        android:id="@+id/ruleRatingBar"
        android:isIndicator="true"
        android:numStars="5"
        android:stepSize="0.5"
        style="?android:attr/ratingBarStyleSmall"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />
</LinearLayout>

0

我发现RatingBar拉伸到最大数量的恒星是因为它包含在具有属性的表格中android:stretchColumns = "*"

当我把stretchCoulumns掉所有列RatingBar根据显示的android:numStars


0

另一种可能性是您正在使用列表视图的适配器中的等级

View android.view.LayoutInflater.inflate(int resource, ViewGroup root, boolean attachToRoot)

要使所有属性正常工作,以下参数是必需的:

  1. 设置rootparent
  2. 布尔attachToRootfalse

例如: convertView = inflater.inflate(R.layout.myId,parent,false);


0

此处的实际情况是使用wrap_content而不是match_parent。如果您将使用match_parent布局,即使它大于numStars变量,也将填充星星。


1
你能提供一些有用的例子吗?
Alex L.19年

是的,在比赛父级上它显示8开始,但是在包装内容上它显示5
Vipin Sharma
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.