Como fazer RatingBar mostrar cinco estrelas

98

Estou seguindo o exemplo padrão de como adicionar a RatingBar. Para controlar o número de estrelas que tentei usar android:numStars="5". O problema é que o número de estrelas não parece fazer absolutamente nada. No layout retrato, obtenho 6 estrelas e quando viro o telefone obtenho cerca de 10 estrelas. Tentei definir o número de estrelas em minha Activity ( myBar.setNumStars(5)) que carrega o xml, mas também não tive sucesso com essa opção.

Portanto, minha pergunta é como defino meu layout de forma que mostre apenas cinco estrelas? Set numStarsnão parece funcionar.

Obrigado antecipadamente, Roland

Roland
fonte

Respostas:

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

em código

mRatingBar.setRating(int)
Alex Volovoy
fonte
120
Obrigado pela sua resposta. O problema é que você não pode usar android: layout_width = "fill_parent", já que o RatingBar ignora o android: numStars othervise. : - /
Roland,
3
Meu requisito é definir a barra de classificação para preencher o pai ou corresponder ao pai, mas estrelas fixas, ou seja, 5. como fazer isso? é possível?
Prashanth Debbadwar
@PrashanthDebbadwar, você tentou três tamanhos diferentes no atributo "estilo"? por exemplo, ratingBarStyle
M. Usman Khan
65

A RatingBar.setNumStardocumentação diz:

Define o número de estrelas a serem mostradas. Para que eles sejam mostrados corretamente, é recomendável que a largura do layout deste widget envolva o conteúdo.

Portanto, definir a largura do layout como wrap_contentdeve resolver esse problema.

Lisandro
fonte
25

Isso funcionou para mim: RatingBardeveria estar dentro de LinearLayoutoutro lugar, em vez de ter a largura do layout definida para envolver o conteúdo RatingBar.

Supun
fonte
1
@ValentinGalea não é tão estranho: a barra de classificação obedece à sua própria largura, enquanto o LinearLayout externo se preocupa em preencher a largura do layout pai.
TechNyquist
13

Além disso, se você definir um layout_weight, substituirá o numStarsatributo.

jsimon
fonte
2
Isso realmente deveria estar nos documentos. Descobri que mesmo adicionando uma configuração de margem direita também tira o numStars
Anton I. Sipos
Este foi um bom conselho. Eu removi o acolchoamento para finalmente fazer funcionar para mim.
Tha Leang
7

Você deve apenas usar numStars="5"em seu XML e definir android:layout_width="wrap_content".
Então, você pode brincar com estilos e outras coisas, mas o "wrap_content" em layout_width é o que resolve.

Adrián Alvarez
fonte
6

Se você estiver usando

android:layout_width="match_parent"

Use wrap_content e só mostrará o conjunto numStars :)

android:layout_width="wrap_content"

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

Configure o número de estrelas no arquivo XML ... Não há necessidade de fornecê-lo em Estilos ou Atividade / Fragmento .... IMPORTANTE: Certifique-se de colocar o WIDTH como Wrap conteúdo e pesos não estão habilitados

Ajith Memana
fonte
5

Também estou enfrentando o problema de exceder as estrelas do que o número especificado de estrelas. Para isso, não queremos nos preocupar com qualquer tipo de layout, seja ele relativo ou linear. Basta usar a largura da seguinte forma:

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


Por favor, evite usar match_parent e fill_parent para ratingbar .
Espero que as coisas sejam úteis.

Deva
fonte
3

Mesmo eu enfrentando o problema @Roland, incluí mais um atributo chamado

android:layout_alignParentRight="true" 

na minha RatingBardeclaração em XML. Este atributo impedia a configuração das estrelas necessárias e a configuração doNumStars

Mantenha-se informado sobre os problemas que encontrar!

ReachmeDroid
fonte
Acabei de ajudar um amigo com a mesma coisa. Eu sugeri essa abordagem e descobri mais tarde que era inválida.
AdamMc331
3

Para mim, tive um problema até remover o enchimento. Parece que há um bug em certos dispositivos que não altera o tamanho da visualização para acomodar o preenchimento e, em vez disso, compacta o conteúdo.

Remova padding, use em seu layout_marginlugar.

John Leehey
fonte
1

Para mostrar uma classificação de estrelas simples em números redondos, use este código

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 usar assim

button.setText (getIntToStar (4));

Nandan Kumar Singh
fonte
1

Você pode adicionar uma classificação padrão de cinco estrelas ao lado do layout xml

android:rating="5"

Editar:

<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
fonte
Esclareça com um exemplo de como adicionar isso ao layout xml.
Kurt Van den Branden
Eu adicionei a visão completa.
Gaurav Shetty
1

Se você estiver envolvendo o RatingBarinterior de um ConstraintLayoutcom match_constraintpara sua largura, a visualização do editor mostrará um número de estrelas proporcionais à sua largura real, não importa se você definir a android:numStarspropriedade. Use wrap_contentpara obter a visualização correta:

<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
fonte
0

O valor padrão é definido com andoid: rating no layout xml.

Kevin Gaudin
fonte
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
fonte
0

Descobri que o RatingBaresticado até um número máximo de estrelas porque foi colocado em uma tabela com o atributo android:stretchColumns = "*".

Depois de stretchCoulumnstirar todas as colunas, as RatingBarexibidas de acordo com o android:numStarsvalor

Jon
fonte
0

Outra possibilidade é que você esteja usando a Avaliação no Adaptador da visualização de lista

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

Os parâmetros abaixo são necessários para que todos os atributos funcionem corretamente:

  1. Defina o rootparaparent
  2. booleano attachToRootcomofalse

Ex: convertView = inflater.inflate (R.layout.myId, pai, falso);

Devrath
fonte
0

A coisa real aqui é usar em wrap_contentvez de match_parent. Se você for usar, match_parento layout será preenchido com as estrelas mesmo que seja mais do que a variável numStars .

Nauman Khaliq
fonte
1
Você poderia fornecer alguns exemplos úteis?
Alex L.
sim, na partida parente estava mostrando 8 início, mas no conteúdo final mostrava 5
Vipin Sharma