Wie man RatingBar macht, um fünf Sterne zu zeigen


98

Ich folge dem Standardbeispiel zum Hinzufügen eines RatingBar. Um die Anzahl der Sterne zu kontrollieren, habe ich versucht, sie zu verwenden android:numStars="5". Das Problem ist, dass die Anzahl der Sterne überhaupt nichts zu bewirken scheint. Im Hochformat bekomme ich 6 Sterne und wenn ich das Telefon umlege, bekomme ich ungefähr 10 Sterne. Ich habe versucht, die Anzahl der Sterne in meiner Aktivität ( myBar.setNumStars(5)) festzulegen, die die XML lädt, aber auch mit dieser Option war kein Erfolg.

Meine Frage ist also, wie ich mein Layout so definiere, dass es nur fünf Sterne zeigt. Set numStarsscheint nicht zu funktionieren.

Vielen Dank im Voraus, Roland

Antworten:


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

in Code

mRatingBar.setRating(int)

120
Danke für deine Antwort. Das Problem war, dass Sie android: layout_width = "fill_parent" nicht verwenden können, da die RatingBar anscheinend den android: numStars othervise ignoriert. : - /
Roland

3
Meine Anforderung ist es, eine Bewertungsleiste festzulegen, um Eltern oder übereinstimmende Eltern zu füllen, aber Fixsterne, dh 5. wie geht das? ist es möglich?
Prashanth Debbadwar

@PrashanthDebbadwar hast du 3 verschiedene Größen im Attribut "Stil" ausprobiert? zB BewertungBarStyle
M. Usman Khan

65

Die RatingBar.setNumStarDokumentation sagt:

Legt die Anzahl der anzuzeigenden Sterne fest. Damit diese richtig angezeigt werden, wird empfohlen, die Layoutbreite dieses Widgets als Wrap-Inhalt zu verwenden.

Das Einstellen der Layoutbreite auf wrap_contentsollte dieses Problem lösen.


25

Dies hat bei mir funktioniert: RatingBarsollte sich in einem LinearLayoutanderen Bereich befinden als der Layoutbreite, für die der Inhalt umbrochen werden soll RatingBar.


1
@ValentinGalea nicht so seltsam: Die Bewertungsleiste berücksichtigt die eigene Breite, während das externe LinearLayout sich darum kümmert, die übergeordnete Layoutbreite zu füllen.
TechNyquist

13

Wenn Sie a festlegen layout_weight, wird das numStarsAttribut durch dieses ersetzt .


2
Dies sollte wirklich in den Dokumenten sein. Ich fand, dass sogar das Hinzufügen einer rechten Randeinstellung auch numStars
Anton I. Sipos

Das war ein guter Rat. Ich habe die Polsterung entfernt, damit sie endlich für mich funktioniert.
Tha Leang

7

Sie sollten nur numStars="5"in Ihrem XML verwenden und festlegen android:layout_width="wrap_content".
Dann können Sie mit Stilen und anderen Dingen herumspielen, aber der "wrap_content" in layout_width ist der Trick.


6

Wenn Sie verwenden

android:layout_width="match_parent"

Verwenden Sie wrap_content und es werden nur die festgelegten numStars angezeigt :)

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

Konfigurieren Sie die Anzahl der Sterne in der XML-Datei ... Sie müssen sie nicht in Stilen oder Aktivität / Fragment angeben. WICHTIG: Stellen Sie sicher, dass Sie die BREITE eingeben, da Wrap-Inhalt und Gewichte nicht aktiviert sind


5

Ich stehe auch vor dem Problem, dass die Sterne überschritten werden, als die Anzahl der Sterne angegeben wurde. Aus diesem Grund möchten wir uns keine Gedanken über den relativen oder linearen Layouttyp machen. Verwenden Sie einfach die Breite wie folgt:

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


Bitte vermeiden Sie die Verwendung von match_parent und fill_parent für die Bewertungsleiste .
Hoffe die Dinge wären hilfreich.


3

Sogar ich hatte das Problem @Roland, ich hatte ein weiteres Attribut namens

android:layout_alignParentRight="true" 

in meiner RatingBarDeklaration in XML. Dieses Attribut verhinderte das Setzen der erforderlichen Sterne und das Einrichten derNumStars

Bleiben Sie über die Probleme auf dem Laufenden, auf die Sie stoßen!


Habe gerade einem Freund mit der gleichen Sache geholfen. Ich schlug diesen Ansatz vor und stellte später fest, dass er ungültig war.
AdamMc331

3

Für mich hatte ich ein Problem, bis ich die Polsterung entfernte. Es sieht so aus, als ob es auf bestimmten Geräten einen Fehler gibt, der die Größe der Ansicht nicht ändert, um das Auffüllen zu berücksichtigen, und stattdessen den Inhalt komprimiert.

Entfernen padding, layout_marginstattdessen verwenden.


1

Verwenden Sie diesen Code, um eine einfache Sternebewertung in runder Zahl anzuzeigen

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

Und benutze es so

button.setText (getIntToStar (4));


1

Sie können neben dem XML-Layout eine Standardbewertung von fünf Sternen hinzufügen

android:rating="5"

Bearbeiten:

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

Bitte erläutern Sie anhand eines Beispiels, wie Sie dies dem XML-Layout hinzufügen können.
Kurt Van den Branden

Ich habe die vollständige Ansicht hinzugefügt.
Gaurav Shetty

1

Wenn Sie das RatingBarInnere eines ConstraintLayoutmit match_constraintfür seine Breite umbrechen, zeigt die Editor-Vorschau eine Anzahl von Sternen an, die proportional zu seiner tatsächlichen Breite sind, unabhängig davon, ob Sie die android:numStarsEigenschaft festlegen . Verwenden Sie wrap_contentdiese Option , um die richtige Vorschau zu erhalten:

<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

Ich fand, dass die RatingBarauf eine maximale Anzahl von Sternen gedehnt, weil es in einer Tabelle mit dem Attribut eingeschlossen war android:stretchColumns = "*".

Sobald ich stretchCoulumnsalle Spalten entfernt habe, wird das RatingBarentsprechend dem android:numStarsWert angezeigt


0

Eine andere Möglichkeit ist, dass Sie die Bewertung im Adapter der Listenansicht verwenden

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

Die folgenden Parameter sind erforderlich, damit alle Attribute ordnungsgemäß funktionieren:

  1. Stellen Sie das rootaufparent
  2. Boolescher Wert attachToRootalsfalse

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


0

Die eigentliche Sache hier ist, wrap_contentstatt zu verwenden match_parent. Wenn Sie match_parentdas Layout verwenden, wird es mit den Sternen gefüllt, auch wenn es mehr als die Variable numStars ist.


1
Könnten Sie einige nützliche Beispiele nennen?
Alex L.

Ja, auf dem Elternteil zeigte es 8 Starts, aber auf dem Wrap-Inhalt zeigte es 5
Vipin Sharma
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.