Як зробити так, щоб RatingBar показував п’ять зірок


98

Я йду за стандартним прикладом того, як додати a 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 othervise. : - /
Роланд

3
Моєю вимогою є встановлення рейтингової смуги для заповнення батьків або збігу батьків, але фіксованих зірочок, тобто 5. як це зробити? Це можливо?
Прашант Деббадвар,

@PrashanthDebbadwar ви пробували 3 різних розміри в атрибуті "стиль"? напр. ratingBarStyle
М. Усман-хан

65

У RatingBar.setNumStarдокументації сказано:

Встановлює кількість зірок для показу. Для того, щоб вони відображалися належним чином, рекомендується ширина макета цього віджету, вміст якого буде обертатися.

Тож встановлення ширини макета до wrap_contentмає вирішити цю проблему.


25

Це спрацювало для мене: RatingBarмає бути всередині, LinearLayoutкрім встановлення ширини макета для обтікання вмісту RatingBar.


1
@ValentinGalea не такий дивний: панель оцінок враховує власну ширину, тоді як зовнішній LinearLayout дбає про заповнення батьківської ширини макета.
TechNyquist

13

Крім того, якщо ви встановите a 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 ... Не потрібно вказувати його у стилях чи діяльності / фрагменті .... ВАЖЛИВО: Переконайтеся, що ви вказали WIDTH як вміст Wrap та ваги не ввімкнено


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.
Курт Ван ден Бранден

Я додав повний вигляд.
Gaurav Shetty

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, батьківський, помилковий);


0

Фактична річ тут - використовувати wrap_contentзамість match_parent. Якщо ви будете використовувати match_parentмакет, він буде заповнений зірками, навіть якщо він більший за змінну numStars .


1
Не могли б ви навести кілька корисних прикладів?
Алекс Л.

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