Come fare RatingBar per mostrare cinque stelle


98

Sto seguendo l'esempio standard di come aggiungere un file RatingBar. Per controllare il numero di stelle che ho provato a usare android:numStars="5". Il problema è che il numero di stelle sembra non fare nulla. Nel layout verticale ottengo 6 stelle e quando lancio il telefono ottengo circa 10 stelle. Ho provato a impostare il numero di stelle nella mia Activity ( myBar.setNumStars(5)) che carica l'xml, ma neanche quella opzione ha avuto successo.

Quindi la mia domanda è: come definisco il mio layout in modo che mostri solo cinque stelle? Il set numStarsnon sembra funzionare.

Grazie in anticipo, Roland

Risposte:


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 codice

mRatingBar.setRating(int)

120
Grazie per la tua risposta. Il problema era che non puoi usare android: layout_width = "fill_parent" poiché l'app RatingBar ignora android: numStars othervise. : - /
Roland

3
Il mio requisito è impostare la barra di valutazione per riempire il genitore o abbinare il genitore ma le stelle fisse, ad esempio 5. come si fa? È possibile?
Prashanth Debbadwar,

@ PrrashanthDebbadwar hai provato 3 diverse dimensioni nell'attributo "stile"? es. ratingBarStyle
M. Usman Khan

65

La RatingBar.setNumStardocumentazione dice:

Imposta il numero di stelle da mostrare. Affinché questi vengano visualizzati correttamente, è consigliabile che la larghezza del layout di questo widget sia contenuto a capo.

Quindi impostare la larghezza del layout su wrap_contentdovrebbe risolvere questo problema.


25

Questo ha funzionato per me: RatingBardovrebbe essere all'interno LinearLayoutdiverso da avere la larghezza del layout impostata per avvolgere il contenuto RatingBar.


1
@ValentinGalea non è poi così strano: la barra di valutazione tiene conto della propria larghezza, mentre il LinearLayout esterno si preoccupa di riempire la larghezza del layout padre.
TechNyquist

13

Inoltre, se imposti a layout_weight, questo sostituisce l' numStarsattributo.


2
Questo dovrebbe davvero essere nei documenti. Ho scoperto che anche l'aggiunta di un'impostazione corretta del margine elimina anche numStars
Anton I. Sipos

Questo è stato un buon consiglio. Ho rimosso l'imbottitura per farlo finalmente funzionare per me.
Tha Leang

7

Dovresti semplicemente usare numStars="5"nel tuo XML e impostare android:layout_width="wrap_content".
Quindi, puoi giocare con gli stili e altre cose, ma "wrap_content" in layout_width è ciò che fa il trucco.


6

Se stai usando

android:layout_width="match_parent"

Usa wrap_content e mostrerà solo il set 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" 
                    />

Configura il numero di stelle nel file XML ... Non è necessario fornirlo in Stili o Attività / Frammento .... IMPORTANTE: assicurati di inserire la LARGHEZZA come contenuto a capo e i pesi non sono abilitati


5

Sto anche affrontando il problema che il superamento delle stelle rispetto al numero di stelle specificato. Per questo, non vogliamo preoccuparci di qualunque tipo di layout sia relativo o lineare. Usa semplicemente la larghezza come segue:

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


Si prega di evitare l' uso match_parent e fill_parent per ratingbar .
Spero che le cose siano utili.


3

Anche io stavo affrontando il problema @Roland, avevo incluso un altro attributo chiamato

android:layout_alignParentRight="true" 

nella mia RatingBardichiarazione in XML. Questo attributo ha impedito l'impostazione delle stelle richieste e l'impostazione delNumStars

Resta aggiornato sui problemi che incontri!


Ho appena aiutato un amico con la stessa cosa. Ho suggerito questo approccio e ho scoperto in seguito che non era valido.
AdamMc331

3

Per me, ho avuto un problema fino a quando non ho rimosso l'imbottitura. Sembra che ci sia un bug su alcuni dispositivi che non altera le dimensioni della vista per adattarsi al riempimento e invece comprime il contenuto.

Rimuovi padding, usa layout_margininvece.


1

Per mostrare una semplice valutazione a stelle in una cifra tonda basta usare questo codice

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

E usalo in questo modo

button.setText (getIntToStar (4));


1

È possibile aggiungere una valutazione predefinita di cinque stelle a lato del layout xml

android:rating="5"

Modificare:

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

Si prega di chiarire con un esempio su come aggiungerlo al layout xml.
Kurt Van den Branden

Ho aggiunto la visualizzazione completa.
Gaurav Shetty

1

Se stai avvolgendo l' RatingBarinterno di un ConstraintLayoutcon match_constraintper la sua larghezza, l'anteprima dell'editor mostrerà un numero di stelle proporzionale alla sua larghezza effettiva, indipendentemente dal fatto che imposti la android:numStarsproprietà. Utilizzare wrap_contentper ottenere l'anteprima corretta:

<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

Ho scoperto che si RatingBarallungava fino a un numero massimo di stelle perché era racchiuso in una tabella con l'attributo android:stretchColumns = "*".

Una volta stretchCoulumnstolte tutte le colonne, vengono RatingBarvisualizzate in base al android:numStarsvalore


0

Un'altra possibilità è che tu stia utilizzando la valutazione nell'adattatore della visualizzazione elenco

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

I seguenti parametri sono necessari affinché tutti gli attributi funzionino correttamente:

  1. Imposta il rootaparent
  2. booleano attachToRootcomefalse

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


0

La cosa reale qui è da usare wrap_contentinvece di match_parent. Se utilizzerai match_parentil layout verrà riempito con le stelle anche se è più della variabile numStars .


1
Potresti fornire alcuni esempi utili?
Alex L.

sì, sul genitore della partita mostrava 8 inizio, ma sul contenuto della conclusione mostrava 5
Vipin Sharma
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.