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

Roland
quelle

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)
Alex Volovoy
quelle
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.

Lisandro
quelle
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.

Supun
quelle
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 .

jsimon
quelle
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.

Adrián Alvarez
quelle
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"

MQoder
quelle
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

Ajith Memana
quelle
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.

Deva
quelle
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!

ReachmeDroid
quelle
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.

John Leehey
quelle
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));

Nandan Kumar Singh
quelle
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" />
Gaurav Shetty
quelle
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" />
Nicola Gallazzi
quelle
0

Der Standardwert wird mit andoid: Bewertung im XML-Layout festgelegt.

Kevin Gaudin
quelle
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
quelle
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

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

Devrath
quelle
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.

Nauman Khaliq
quelle
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