Wie erstelle ich eine kleinere RatingBar?

134

Ich habe eine Bewertungsleiste in einem Layout hinzugefügt :

<RatingBar 
    android:id="@+id/ratingbar"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:numStars="5"
    android:stepSize="1.0"
    />  

Der Standardstil für die Bewertungsleiste ist jedoch zu groß.
Ich habe versucht, es durch Hinzufügen des Android-Stils zu ändern:style="?android:attr/ratingBarStyleSmall"

Das Ergebnis ist jedoch zu klein und es ist unmöglich, mit dieser Eigenschaft eine Rate festzulegen.

Wie könnte ich tun?

Clem
quelle

Antworten:

106

Das Standard-RatingBar-Widget ist irgendwie lahm.

Die Quelle verweist ?android:attr/ratingBarStyleIndicatorzusätzlich zu dem ?android:attr/ratingBarStyleSmallbereits vertrauten Stil auf den Stil " " . ratingBarStyleIndicatorist etwas kleiner, aber immer noch ziemlich hässlich und die Kommentare weisen darauf hin, dass diese Stile "keine Interaktion unterstützen".

Du bist wahrscheinlich besser dran, wenn du deine eigenen rollst. Unter http://kozyr.zydako.net/2010/05/23/pretty-ratingbar/ finden Sie eine anständige Anleitung, die zeigt, wie das geht. (Ich habe es noch nicht selbst gemacht, werde es aber in ungefähr einem Tag versuchen.)

Viel Glück!

ps Entschuldigung, ich wollte einen Link zur Quelle veröffentlichen, damit Sie darin stöbern können, aber ich bin ein neuer Benutzer und kann nicht mehr als 1 URL veröffentlichen. Wenn Sie sich durch den Quellbaum graben, befindet er sich unter frameworks / base / core / java / android / widget / RatingBar.java

Farray
quelle
Es ist viel besser,? Android: attr / reviewBarStyleSmall zu verwenden und das globale Bewertungsthema festzulegen, aber nicht den genauen Themennamen zu verwenden, vielen Dank;)
Tsung Goh
7
Wenn wir die Indikatoreigenschaft android: isIndicator = "false" setzen, werden wir damit interagieren.
Mayur R. Amipara
Die Dokumente implizieren die BewertungBarStyleSmall ist die kleinere der beiden. Ich denke, Ihr Kommentar ist rückwärts.
AdamMc331
5
Link ist unterbrochen.
Denny
@ Penny Content ist im Google Cache verfügbar . Ich aktualisiere den Beitrag nicht mit dem Inhalt, da ich mir seit Jahren keine Android-Bewertungsleisten mehr angesehen habe und nicht sicher bin, ob der Inhalt dieses Links noch gültig ist.
Farray
195

Wie man den hier angegebenen Code klebt ...

Schritt 1. Sie benötigen Ihre eigenen Bewertungssterne in res/drawable...

Ein voller Stern

Leerer Stern

Schritt 2 In res/drawableSie müssen ratingstars.xmlwie folgt ...

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@android:id/background"
          android:drawable="@drawable/star_empty" />
    <item android:id="@android:id/secondaryProgress"
          android:drawable="@drawable/star_empty" />
    <item android:id="@android:id/progress"
          android:drawable="@drawable/star" />
</layer-list>

Schritt 3 In res/valuesSie müssen styles.xmlwie folgt ...

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="foodRatingBar" parent="@android:style/Widget.RatingBar">
        <item name="android:progressDrawable">@drawable/ratingstars</item>
        <item name="android:minHeight">22dip</item>
        <item name="android:maxHeight">22dip</item>
    </style>
</resources>

Schritt 4 In Ihrem Layout ...

<RatingBar 
      android:id="@+id/rtbProductRating"
      android:layout_height="wrap_content"
      android:layout_width="wrap_content"
      android:numStars="5"
      android:rating="3.5"
      android:isIndicator="false"
      style="@style/foodRatingBar"    
/>  
Vaibhav Jani
quelle
7
Sollte das nicht sein: <item android: id = "@ + android: id / primaryProgress" android: drawable = "@ drawable / star_empty" /> sei "@ drawable / star_half" /> oder wie auch immer du es genannt hast?
StackOverflowed
8
Vielen Dank. Nur ein kleiner Kommentar: Sie brauchen kein Bild von einem halben Stern. Es wird automatisch basierend auf dem Fortschritt generiert.
Boris Strandjev
1
@Vlad Lies die erste Antwortzeile, die ich erwähnt habe, woher ich diese bekomme.
Vaibhav Jani
4
funktioniert perfekt :) aber ich habe 2 Probleme .. numStars funktioniert nicht mehr und ich kann es nicht ein bisschen größer bekommen, selbst wenn ich die maximale und
minimale
1
Danke @PiedPiper - das hat mir viel Zeit gespart !! Beste Erklärung aller Zeiten!
Edmond Tamas
70

Benutz einfach:

android:scaleX="0.5"
android:scaleY="0.5"

Ändern Sie den Skalierungsfaktor entsprechend Ihren Anforderungen.

Um zu skalieren, ohne links eine Polsterung zu erstellen, fügen Sie hinzu

android:transformPivotX="0dp"
Loolooii
quelle
scaleX scaleY sind gut, aber lassen Sie hässliche Polsterung, wenn Sie diese Polsterung loswerden könnten, wäre es die einfachste perfekte Antwort
Ahmad Dwaik 'Warlock'
Außerdem benötigen sie Android 3.0 / API 11
Averasko
6
Ich löse die hässliche (rechte) Polsterung durch codeandroid:scaleX="0.75" android:scaleY="0.75" android:layout_marginRight="-25dp"
hannes ach
1
Das scheint zwar die einfachste Lösung zu sein, hat aber bei mir nicht funktioniert. Aus irgendeinem Grund gab es keine Wirkung. Liegt es daran, dass ich auf Android 5.x bin?
Nautilus
Sie können zusätzliche Polster entfernen, indem Sie die Höhe der Bewertungsleiste android:layout_height="40dp"
Manohar Reddy
43

Es ist nicht erforderlich, dem Listener einen Listener hinzuzufügen ?android:attr/ratingBarStyleSmall. Fügen android:isIndicator=falseSie einfach hinzu und es werden Klickereignisse erfasst, z

<RatingBar
  android:id="@+id/myRatingBar"
  style="?android:attr/ratingBarStyleSmall"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:numStars="5"
  android:isIndicator="false" />
Zyamys
quelle
4
isIndicator ist der Schlüssel!
Deadfish
19

das kleine vom Betriebssystem implementieren

<RatingBar
    android:id="@+id/ratingBar"
    style="?android:attr/ratingBarStyleSmall"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" 
    />
Bouchehboun Saad
quelle
2
Die Bewertungsleiste kann nicht angeklickt werden, wenn der obige Code angegeben wird.
Sharath
16

wende dies an.

<RatingBar android:id="@+id/indicator_ratingbar"
    style="?android:attr/ratingBarStyleIndicator"
    android:layout_marginLeft="5dip"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_vertical" />
Mohammed Azharuddin Shaikh
quelle
1
Obwohl optisch ist es großartig. Klicken Sie auf Ereignisse, die bei dieser Lösung nicht funktionieren. Hast du eine Lösung dafür?
Gökhan Barış Aker
4
Wenn Sie möchten, dass die Klicks funktionieren, verwenden Sie Android: isIndicator = "false"
D4rWiNS
15

Ich fand eine einfachere Lösung als ich denke, die von den oben genannten gegeben wurde und einfacher als Ihre eigene zu rollen. Ich habe einfach eine kleine Bewertungsleiste erstellt und dann einen onTouchListener hinzugefügt. Von dort aus berechne ich die Breite des Klicks und bestimme daraus die Anzahl der Sterne. Nachdem ich dies mehrmals verwendet habe, ist die einzige Besonderheit, die ich gefunden habe, dass das Zeichnen eines kleinen Bewertungsbalkens in einer Tabelle nicht immer richtig ausfällt, es sei denn, ich füge es in ein LinearLayout ein (sieht im Editor richtig aus, aber nicht im Gerät). . Wie auch immer, in meinem Layout:

            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" >
                <RatingBar
                    android:id="@+id/myRatingBar"
                    style="?android:attr/ratingBarStyleSmall"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:numStars="5" />
            </LinearLayout>

und innerhalb meiner Tätigkeit:

    final RatingBar minimumRating = (RatingBar)findViewById(R.id.myRatingBar);
    minimumRating.setOnTouchListener(new OnTouchListener()
    { 
        public boolean onTouch(View view, MotionEvent event)
        { 
            float touchPositionX = event.getX();
            float width = minimumRating.getWidth();
            float starsf = (touchPositionX / width) * 5.0f;
            int stars = (int)starsf + 1;
            minimumRating.setRating(stars);
            return true; 
        } 
    });

Ich hoffe das hilft jemand anderem. Auf jeden Fall einfacher als das eigene Zeichnen (obwohl ich festgestellt habe, dass das auch funktioniert, aber ich wollte nur eine einfache Verwendung von Sternen).

user1676075
quelle
Es funktioniert und es ist einfach ... aber die ratingBarStyleSmallSterne sind wirklich zu klein, um nützlich zu sein. Ich denke, ich muss meine eigenen rollen, um Sterne mittlerer Größe zu erhalten.
Beer Me
5
<RatingBar
    android:id="@+id/rating_bar"
    style="@style/Widget.AppCompat.RatingBar.Small"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />
chry
quelle
5
 <RatingBar
                    android:rating="3.5"
                    android:stepSize="0.5"
                    android:numStars="5"
                    style = "?android:attr/ratingBarStyleSmall"
                    android:theme="@style/RatingBar"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"/>

// if you want to style 

 <style name="RatingBar" parent="Theme.AppCompat">
        <item name="colorControlNormal">@color/colorPrimary</item>
        <item name="colorControlActivated">@color/colorAccent</item>
    </style>

// füge diese Zeile für eine kleine Bewertungsleiste hinzu

style = "?android:attr/ratingBarStyleSmall"
indrajeet jyoti
quelle
Während dieses Code-Snippet die Lösung sein kann, hilft das Hinzufügen einer Erklärung wirklich, die Qualität Ihres Beitrags zu verbessern. Denken Sie daran, dass Sie die Frage für Leser in Zukunft beantworten und diese Personen möglicherweise die Gründe für Ihren Codevorschlag nicht kennen.
Johan
3

Obwohl die Antwort von Farry funktioniert, hat RatingBar für Samsung-Geräte eine zufällige blaue Farbe anstelle der von mir definierten angenommen. Also benutze

style="?attr/ratingBarStyleSmall"

stattdessen.

Vollständiger Code zur Verwendung:

<android.support.v7.widget.AppCompatRatingBar
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                style="?attr/ratingBarStyleSmall" // use smaller version of icons
                android:theme="@style/RatingBar"
                android:rating="0"
                tools:rating="5"/>

<style name="RatingBar" parent="Theme.AppCompat">
        <item name="colorControlNormal">@color/grey</item>
        <item name="colorControlActivated">@color/yellow</item>
        <item name="android:numStars">5</item>
        <item name="android:stepSize">1</item>
    </style>
verletzen
quelle
3

Die beste Antwort für kleine Bewertungsbalken

<RatingBar
                    android:layout_width="wrap_content"
                    style = "?android:attr/ratingBarStyleSmall"
                    android:layout_height="wrap_content" />
Arun Prajapati
quelle
2

Verwenden Sie diesen Code

<RatingBar
    android:id="@+id/ratingBarSmalloverall"
    style="?android:attr/ratingBarStyleSmall"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true"
    android:layout_centerVertical="true"
    android:layout_marginRight="30dp"
    android:isIndicator="false"
    android:numStars="5" />
Dharmendra Mishra
quelle
2
<RatingBar
    android:id="@+id/ratingBar1"
    android:numStars="5"
    android:stepSize=".5"
    android:rating="3.5"
    style="@android:style/Widget.DeviceDefault.RatingBar.Small"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />
MDP
quelle
2

Die beste Antwort, die ich bekommen habe

  <style name="MyRatingBar" parent="@android:style/Widget.RatingBar">
    <item name="android:minHeight">15dp</item>
    <item name="android:maxHeight">15dp</item>
    <item name="colorControlNormal">@color/white</item>
    <item name="colorControlActivated">@color/home_add</item>
</style>

Benutzer wie dieser

<RatingBar
                style="?android:attr/ratingBarStyleIndicator"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:isIndicator="false"
                android:max="5"
                android:rating="3"
                android:scaleX=".8"
                android:scaleY=".8"
                android:theme="@style/MyRatingBar" />

Zunahme / Abnahme Größen unter Verwendung von scaleX und scaleY Wert

AMAN SINGH
quelle
1

Verwenden Sie den folgenden Code für kleine Bewertungsbalken mit onTouch-Ereignis

enter code here


<RatingBar
            android:id="@+id/ratingBar"
            style="?android:ratingBarStyleSmall"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:isIndicator="false"
            android:rating="4"
            android:stepSize="0.5" />
arunkrishna
quelle
0

Nach vielen Recherchen habe ich herausgefunden, dass die beste Lösung zur Reduzierung der Größe von benutzerdefinierten Bewertungsbalken darin besteht, die Größe des Fortschritts in bestimmten Größen wie unten erwähnt zeichnbar zu machen:

xxhdpi - 48 * 48 px

xhdpi - 36 * 36 px

hdpi - 24 * 24 px

Und mit Stil setzen Sie die Mini- und Max-Höhe für alle Auflösungen auf 16 dp.

Lassen Sie mich wissen, wenn dies nicht dazu beiträgt, die besten Bewertungsbalken für kleine Größen zu erhalten, da diese Größen meiner Meinung nach sehr kompatibel sind und dem Stilattribut bewertungsbalken entsprechen.

Praveen Dewangan
quelle
0

Es funktioniert für mich in der Bewertungsleiste xml style = "? Android: attr / reviewBarStyleSmall" add this.it wird funktionieren.

S HemaNandhini
quelle
-4

Ich löse dieses Problem wie folgt: style = "? Android: attr / reviewBarStyleSmall"

Hai Rom
quelle
Dies hat das OP bereits versucht und andere Antworten bereits erwähnt.
Pang