Как сделать так, чтобы RatingBar отображало пять звезд


99

Я следую стандартному примеру того, как добавить RatingBar. Чтобы контролировать количество звездочек, я пытался использовать android:numStars="5". Проблема в том, что количество звезд, похоже, вообще ни на что не влияет. В портретной ориентации я получаю 6 звезд, а когда переворачиваю телефон, я получаю около 10 звезд. Я попытался установить количество звездочек в моем Activity ( myBar.setNumStars(5)), который загружает xml, но и с этой опцией успеха не было.

Итак, мой вопрос: как мне определить мой макет, чтобы он отображал только пять звезд? Сет numStarsне работает.

Заранее спасибо, Роланд

Ответы:


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 в противном случае. : - /
Roland

3
Мое требование - установить панель рейтинга, чтобы заполнить родительский элемент или соответствующий родительский элемент, но с фиксированными звездочками, т.е. 5. как это сделать? Является ли это возможным?
Прашант Деббадвар

@PrashanthDebbadwar ты пробовал 3 разных размера в атрибуте style? например, ratingBarStyle
M. Usman Khan

66

В RatingBar.setNumStarдокументации говорится:

Устанавливает количество отображаемых звезд. Чтобы они отображались правильно, рекомендуется, чтобы ширина макета этого виджета была обтеканием содержимого.

Таким образом, установка ширины макета wrap_contentдолжна решить эту проблему.


25

Это сработало для меня: RatingBarдолжно быть внутри, LinearLayoutкроме ширины макета, установленной для переноса содержимого RatingBar.


1
@ValentinGalea, впрочем, не так уж и странно: панель рейтинга учитывает свою ширину, а внешний LinearLayout заботится о заполнении ширины своего родительского макета.
TechNyquist

13

Кроме того, если вы установите layout_weight, это заменяет numStarsатрибут.


2
Это действительно должно быть в документации. Я обнаружил, что даже добавление правого поля также вызывает сбой numStars
Антон И. Сипос

Это был хороший совет. Я удалил прокладку, чтобы наконец заставить ее работать для меня.
Tha Leang

7

Вы должны просто использовать numStars="5"в своем XML и установить android:layout_width="wrap_content".
Затем вы можете поиграть со стилями и другими вещами, но «wrap_content» в layout_width - вот что помогает.


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));


Пожалуйста, избегайте использования match_parent и fill_parent для панели рейтинга .
Надеюсь, это будет полезно.


3

Даже когда я столкнулся с проблемой @Roland, я добавил еще один атрибут под названием

android:layout_alignParentRight="true" 

в моем RatingBarобъявлении в XML. Этот атрибут не позволял устанавливать требуемые звезды и настраиватьNumStars

Оставайтесь в курсе проблем, с которыми вы сталкиваетесь!


Только что помог другу с тем же. Я предложил такой подход, а позже выяснил, что он неверен.
AdamMc331

3

Для меня у меня была проблема, пока я не удалил прокладку. Похоже, что на некоторых устройствах есть ошибка, которая не изменяет размер представления для размещения отступов, а вместо этого сжимает содержимое.

Удалите padding, используйте layout_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.
Курт Ван ден Бранден,

Я добавил полный вид.
Гаурав Шетти

1

Если вы оборачиваете RatingBarвнутреннюю часть с ConstraintLayoutпомощью match_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. Установите rootвparent
  2. логическое значение attachToRootкакfalse

Пример: convertView = inflater.inflate (R.layout.myId, parent, false);


0

Фактически здесь нужно использовать wrap_contentвместо match_parent. Если вы будете использовать match_parentмакет, он будет заполнен звездочками, даже если он больше, чем значение переменной numStars .


1
Не могли бы вы привести несколько полезных примеров?
Alex L.

да, в родительском матче он показывал 8 старт, но в контенте обертывания он показал 5
Випин Шарма
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.