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

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)

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.


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.


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.


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.


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"


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


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.


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!


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.


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


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

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


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

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


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


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 .


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.