Comment faire en sorte que RatingBar affiche cinq étoiles

98

Je suis l'exemple standard de la façon d'ajouter un fichier RatingBar. Pour contrôler le nombre d'étoiles que j'ai essayé d'utiliser android:numStars="5". Le problème est que le nombre d'étoiles ne semble rien faire du tout. En mode portrait, j'obtiens 6 étoiles et lorsque je retourne le téléphone, j'obtiens environ 10 étoiles. J'ai essayé de définir le nombre d'étoiles dans mon Activity ( myBar.setNumStars(5)) qui charge le xml, mais cette option n'a pas non plus réussi.

Ma question est donc de savoir comment définir ma mise en page pour qu'elle n'affiche que cinq étoiles? L'ensemble numStarsne semble pas fonctionner.

Merci d'avance, Roland

Roland
la source

Réponses:

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

dans du code

mRatingBar.setRating(int)
Alex Volovoy
la source
120
Merci pour votre réponse. Le problème était que vous ne pouvez pas utiliser android: layout_width = "fill_parent" car l'apperenty RatingBar ignore l'android: numStars othervise. : - /
Roland
3
Mon exigence est de définir la barre de notation pour remplir le parent ou correspondre au parent, mais des étoiles fixes, c'est-à-dire 5. comment faire? c'est possible?
Prashanth Debbadwar
@PrashanthDebbadwar avez-vous essayé 3 tailles différentes dans l'attribut "style"? eg ratingBarStyle
M. Usman Khan
65

La RatingBar.setNumStardocumentation dit:

Définit le nombre d'étoiles à afficher. Pour que ceux-ci s'affichent correctement, il est recommandé que la largeur de mise en page de ce widget soit enveloppée dans le contenu.

Donc, définir la largeur de la mise en page sur wrap_contentdevrait résoudre ce problème.

Lisandro
la source
25

Cela a fonctionné pour moi: RatingBardevrait être à l'intérieur LinearLayoutautre que la largeur de mise en page définie pour envelopper le contenu RatingBar.

Supun
la source
1
@ValentinGalea n'est pas si étrange cependant: la barre de notation se soucie de sa propre largeur, tandis que le LinearLayout externe se soucie de remplir la largeur de sa disposition parente.
TechNyquist
13

De plus, si vous définissez a layout_weight, cela remplace l' numStarsattribut.

jsimon
la source
2
Cela devrait vraiment être dans la documentation. J'ai trouvé que même l'ajout d'un paramètre de marge à droite jette également numStars
Anton I. Sipos
C'était un bon conseil. J'ai enlevé le rembourrage pour enfin le faire fonctionner pour moi.
Tha Leang
7

Vous devez simplement utiliser numStars="5"dans votre XML et définir android:layout_width="wrap_content".
Ensuite, vous pouvez jouer avec les styles et autres choses, mais le "wrap_content" dans layout_width est ce qui fait l'affaire.

Adrián Alvarez
la source
6

Si vous utilisez

android:layout_width="match_parent"

Utilisez wrap_content et il n'affichera que l'ensemble numStars :)

android:layout_width="wrap_content"

MQoder
la source
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" 
                    />

Configurez le nombre d'étoiles dans le fichier XML ... Pas besoin de le fournir dans Styles ou Activity / Fragment .... IMPORTANT: assurez-vous de mettre la LARGEUR comme contenu Wrap et les poids ne sont pas activés

Ajith Memana
la source
5

Je suis également confronté au problème qui dépasse le nombre d'étoiles spécifié. Pour cela, nous ne voulons pas nous soucier du type de mise en page, qu'elle soit relative ou linéaire. Utilisez simplement la largeur comme suit:

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


Veuillez éviter d' utiliser match_parent et fill_parent pour la barre de notation .
J'espère que les choses seraient utiles.

Deva
la source
3

Même si j'étais confronté au problème @Roland, j'avais inclus un autre attribut appelé

android:layout_alignParentRight="true" 

dans ma RatingBardéclaration en XML. Cet attribut empêchait de fixer les étoiles requises et de configurer leNumStars

Restez au courant des problèmes que vous rencontrez!

ReachmeDroid
la source
Je viens d'aider un ami avec la même chose. J'ai suggéré cette approche et j'ai découvert plus tard qu'elle n'était pas valide.
AdamMc331
3

Pour moi, j'ai eu un problème jusqu'à ce que j'enlève le rembourrage. Il semble qu'il y ait un bogue sur certains appareils qui ne modifie pas la taille de la vue pour accueillir le remplissage, mais compresse plutôt le contenu.

Supprimer padding, utiliser à la layout_marginplace.

John Leehey
la source
1

Pour afficher un classement par étoiles simple en chiffre rond, utilisez simplement ce code

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

Et utilisez-le comme ça

button.setText (getIntToStar (4));

Nandan Kumar Singh
la source
1

Vous pouvez ajouter une note par défaut de cinq étoiles à côté de la mise en page XML

android:rating="5"

Éditer:

<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
la source
Veuillez clarifier avec un exemple comment ajouter ceci à la mise en page XML.
Kurt Van den Branden
J'ai ajouté la vue complète.
Gaurav Shetty
1

Si vous enveloppez l' RatingBarintérieur d'un ConstraintLayoutavec match_constraintpour sa largeur, l'aperçu de l'éditeur affichera un nombre d'étoiles proportionnel à sa largeur réelle, peu importe si vous définissez la android:numStarspropriété. Utilisez wrap_contentpour obtenir l'aperçu correct:

<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
la source
0

La valeur par défaut est définie avec andoid: rating dans la mise en page xml.

Kevin Gaudin
la source
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
la source
0

J'ai trouvé que l' RatingBarétirait à un nombre maximum d'étoiles car il était inclus dans un tableau avec l'attributandroid:stretchColumns = "*" .

Une fois que j'ai stretchCoulumnsenlevé toutes les colonnes, le RatingBaraffiché en fonction de la android:numStarsvaleur

Jon
la source
0

Une autre possibilité est que vous utilisez le classement dans l'adaptateur de la vue liste

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

Les paramètres ci-dessous sont nécessaires pour que tous les attributs fonctionnent correctement:

  1. Réglez le rootsurparent
  2. booléen attachToRootcommefalse

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

Devrath
la source
0

La chose réelle ici est d'utiliser wrap_contentau lieu de match_parent. Si vous utilisez, match_parentla mise en page sera remplie d'étoiles même si elle est supérieure à la variable numStars .

Nauman Khaliq
la source
1
Pouvez-vous donner des exemples utiles?
Alex L.
oui, sur le parent du match, il montrait 8 début, mais sur le contenu de la fin, il a montré 5
Vipin Sharma