Jak sprawić, by RatingBar wyświetlał pięć gwiazdek

100

Podążam za standardowym przykładem dodawania pliku RatingBar. Aby kontrolować liczbę gwiazdek, których próbowałem użyć android:numStars="5". Problem w tym, że liczba gwiazd wydaje się nic nie robić. W układzie portretowym dostaję 6 gwiazdek, a kiedy odwrócę telefon, dostaję około 10 gwiazdek. Próbowałem ustawić liczbę gwiazdek w mojej aktywności ( myBar.setNumStars(5)), która ładuje plik xml, ale ta opcja również się nie powiodła.

Więc moje pytanie brzmi, jak zdefiniować mój układ, aby wyświetlał tylko pięć gwiazdek? Zestaw numStarswydaje się nie działać.

Z góry dziękuję, Roland

Roland
źródło

Odpowiedzi:

181
<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" />

W kodzie

mRatingBar.setRating(int)
Alex Volovoy
źródło
121
Dzięki za odpowiedź. Problem polegał na tym, że nie możesz używać androida: layout_width = "fill_parent", ponieważ Apperenty RatingBar ignoruje android: numStars othervise. : - /
Roland
3
Moim wymaganiem jest ustawienie paska oceny tak, aby wypełniał rodzica lub pasował do rodzica, ale stałe gwiazdki, tj. 5. jak to zrobić? Czy to możliwe?
Prashanth Debbadwar
@PrashanthDebbadwar Czy wypróbowałeś 3 różne rozmiary w atrybucie „style”? np. ratingBarStyle
M. Usman Khan
67

RatingBar.setNumStarDokumentacja mówi:

Ustawia liczbę wyświetlanych gwiazdek. Aby były one poprawnie wyświetlane, zaleca się, aby szerokość układu tego widżetu była zawijana.

Zatem ustawienie szerokości układu na wrap_contentpowinno rozwiązać ten problem.

Lisandro
źródło
25

To zadziałało dla mnie: RatingBarpowinno być wewnątrz LinearLayoutinnego niż ustawienie szerokości układu do zawijania zawartości RatingBar.

Supun
źródło
1
@ValentinGalea nie jest jednak takie dziwne: pasek oceny ma swoją własną szerokość, podczas gdy zewnętrzny LinearLayout dba o wypełnienie szerokości swojego układu nadrzędnego.
TechNyquist
13

Dodatkowo, jeśli ustawisz layout_weight, to zastępuje numStarsatrybut.

jsimon
źródło
2
To naprawdę powinno być w dokumentacji. Zauważyłem, że nawet dodanie odpowiedniego ustawienia marginesu odrzuca również numStars
Anton I. Sipos
To była dobra rada. Usunąłem wyściółkę, aby w końcu zadziałało.
Tha Leang
7

Powinieneś po prostu użyć numStars="5"w swoim XML i ustawić android:layout_width="wrap_content".
Następnie możesz bawić się stylami i innymi rzeczami, ale „wrap_content” w layout_width jest tym, co załatwia sprawę.

Adrián Alvarez
źródło
6

Jeśli używasz

android:layout_width="match_parent"

Użyj wrap_content, a pokaże tylko zestaw numStars :)

android:layout_width="wrap_content"

MQoder
źródło
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" 
                    />

Skonfiguruj liczbę gwiazdek w pliku XML ... Nie musisz podawać jej w stylach lub aktywności / fragmencie ... WAŻNE: upewnij się, że ustawiłeś SZEROKOŚĆ jako zawartość zawijania i wagi nie są włączone

Ajith Memana
źródło
5

Stoję również przed problemem, że liczba gwiazd przekracza określoną liczbę. W tym celu nie chcemy martwić się o typ układu, względny lub liniowy. Po prostu użyj szerokości w następujący sposób:

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


Należy unikać korzystania match_parent i fill_parent dla ratingbar .
Mam nadzieję, że te rzeczy będą pomocne.

Deva
źródło
3

Nawet ja miałem problem z @Roland, dodałem jeszcze jeden atrybut o nazwie

android:layout_alignParentRight="true" 

w mojej RatingBardeklaracji w XML. Ten atrybut uniemożliwił ustawienie wymaganych gwiazd i skonfigurowanieNumStars

Bądź na bieżąco z napotkanymi problemami!

ReachmeDroid
źródło
Właśnie pomogłem przyjacielowi w tym samym. Zasugerowałem takie podejście, a później okazało się, że jest nieważne.
AdamMc331
3

Dla mnie miałem problem, dopóki nie usunąłem wyściółki. Wygląda na to, że na niektórych urządzeniach jest błąd, który nie zmienia rozmiaru widoku w celu dostosowania dopełnienia, a zamiast tego kompresuje zawartość.

Usunąć padding , użyj layout_marginzamiast tego.

John Leehey
źródło
1

Aby wyświetlić prostą ocenę w postaci okrągłej liczby gwiazdek, użyj tego kodu

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

I używaj tego w ten sposób

button.setText (getIntToStar (4));

Nandan Kumar Singh
źródło
1

Możesz dodać domyślną ocenę pięciu gwiazdek z boku układu XML

android:rating="5"

Edytować:

<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" />
Gaurav Shetty
źródło
Wyjaśnij na przykładzie, jak dodać to do układu XML.
Kurt Van den Branden
Dodałem cały widok.
Gaurav Shetty
1

Jeśli zawijasz RatingBarwnętrze a ConstraintLayoutze match_constraintwzględu na szerokość, podgląd edytora pokaże liczbę gwiazdek proporcjonalną do jego rzeczywistej szerokości, bez względu na to, co jeśli ustawisz android:numStarswłaściwość. Użyj, wrap_contentaby uzyskać poprawny podgląd:

<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" />
Nicola Gallazzi
źródło
0

Wartość domyślna jest ustawiana za pomocą andoid: rating w układzie xml.

Kevin Gaudin
źródło
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>
Muzikant
źródło
0

Okazało się, że RatingBarrozciągnięty do maksymalnej liczby gwiazdek, ponieważ został ujęty w tabeli z atrybutem android:stretchColumns = "*".

Gdy stretchCoulumnszdjąłem wszystkie kolumny, RatingBarwyświetlono zgodnie z android:numStarswartością

Jon
źródło
0

Inną możliwością jest to, że używasz oceny w adapterze widoku listy

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

Poniższe parametry są niezbędne, aby wszystkie atrybuty działały poprawnie:

  1. Ustaw rootnaparent
  2. boolean attachToRootasfalse

Np .: convertView = inflater.inflate (R.layout.myId, rodzic, fałsz);

Devrath
źródło
0

Właściwie tutaj jest użycie wrap_contentzamiast match_parent. Jeśli użyjesz match_parentukładu, zostanie on wypełniony gwiazdkami, nawet jeśli jest większy niż zmienna numStars .

Nauman Khaliq
źródło
1
Czy możesz podać przydatne przykłady?
Alex L.
tak, na meczu nadrzędnym pokazywał początek 8, ale na zawijaniu pokazywał 5
Vipin Sharma