วิธีสร้าง RatingBar ให้แสดงห้าดาว


100

ฉันกำลังทำตามตัวอย่างมาตรฐานของวิธีการเพิ่มไฟล์RatingBar. android:numStars="5"เพื่อควบคุมจำนวนดาวที่ฉันพยายามที่จะใช้ ปัญหาคือจำนวนดาวดูเหมือนไม่ได้ทำอะไรเลย ในรูปแบบแนวตั้งฉันได้รับ 6 ดาวและเมื่อฉันพลิกโทรศัพท์ฉันจะได้รับประมาณ 10 ดาว ฉันพยายามตั้งค่าจำนวนดาวในกิจกรรมของฉัน ( myBar.setNumStars(5)) ที่โหลด xml แต่ตัวเลือกนั้นก็ไม่ประสบความสำเร็จเช่นกัน

ดังนั้นคำถามของฉันคือฉันจะกำหนดเลย์เอาต์ของฉันได้อย่างไรจึงจะแสดงเพียงห้าดาว ชุดnumStarsดูเหมือนจะไม่ทำงาน

ขอบคุณล่วงหน้า Roland

คำตอบ:


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

ในรหัส

mRatingBar.setRating(int)

123
ขอบคุณสำหรับคำตอบ. ปัญหาคือคุณไม่สามารถใช้ android: layout_width = "fill_parent" เนื่องจากแอป RatingBar ไม่สนใจ android: numStars othervise : - /
Roland

3
ความต้องการของฉันคือการตั้งค่าแถบเรตติ้งเพื่อเติมพาเรนต์หรือตรงกับพาเรนต์ แต่ดาวคงที่เช่น 5 จะทำอย่างไร? เป็นไปได้ไหม?
Prashanth Debbadwar

@PrashanthDebbadwar คุณลอง 3 ขนาดที่แตกต่างกันในแอตทริบิวต์ "style" หรือไม่? เช่น ratingBarStyle
M. Usman Khan

68

RatingBar.setNumStarเอกสารพูดว่า:

ตั้งค่าจำนวนดาวที่จะแสดง เพื่อให้สิ่งเหล่านี้แสดงอย่างถูกต้องขอแนะนำให้ใช้ความกว้างเค้าโครงของวิดเจ็ตนี้เป็นเนื้อหาที่รวมไว้

ดังนั้นการตั้งค่าความกว้างของเค้าโครงwrap_contentควรแก้ปัญหานี้ได้


26

นี้ทำงานสำหรับฉัน: RatingBarควรจะเป็นภายในLinearLayoutอื่น ๆ RatingBarกว่าที่มีรูปแบบความกว้างชุดกับเนื้อหาสำหรับห่อ


1
@ValentinGalea ไม่แปลกเท่าไหร่: แถบการให้คะแนนคำนึงถึงความกว้างของตัวเองในขณะที่ LinearLayout ภายนอกให้ความสำคัญกับการเติมความกว้างของเค้าโครงหลัก
TechNyquist

13

นอกจากนี้หากคุณตั้งค่า a สิ่งlayout_weightนี้จะแทนที่numStarsแอตทริบิวต์


2
สิ่งนี้ควรอยู่ในเอกสาร ฉันพบว่าแม้แต่การเพิ่มการตั้งค่าขอบด้านขวาก็ยังทำให้ numStars ปิดตัวลง
Anton I. Sipos

นี่เป็นคำแนะนำที่ดี ฉันถอดช่องว่างภายในออกเพื่อให้มันใช้งานได้ในที่สุด
ท่าตะกั่ว

7

คุณก็ควรจะใช้ numStars="5"ในรูปแบบ XML android:layout_width="wrap_content"ของคุณและชุด
จากนั้นคุณสามารถเล่นกับสไตล์และสิ่งอื่น ๆ ได้ แต่ "wrap_content" ใน layout_width คือกลเม็ด


6

หากคุณกำลังใช้

android:layout_width="match_parent"

ใช้ wrap_content และจะแสดงชุด 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" 
                    />

กำหนดค่าจำนวนดาวในไฟล์ XML ... ไม่จำเป็นต้องระบุในสไตล์หรือกิจกรรม / ส่วนย่อย .... สำคัญ: ตรวจสอบให้แน่ใจว่าคุณใส่ WIDTH เป็นเนื้อหาตัดและไม่ได้เปิดใช้น้ำหนัก


5

ฉันยังประสบปัญหาที่มีดวงดาวเกินกว่าที่กำหนดไว้ สำหรับสิ่งนี้เราไม่ต้องการกังวลเกี่ยวกับรูปแบบการจัดวางแบบสัมพัทธ์หรือเชิงเส้น เพียงใช้ความกว้างดังนี้:

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


โปรดหลีกเลี่ยงการใช้match_parent และ fill_parentสำหรับratingbar
หวังว่าสิ่งต่างๆจะเป็นประโยชน์


3

แม้ว่าฉันจะประสบปัญหาที่ @Roland แต่ฉันได้รวมแอตทริบิวต์อีกหนึ่งรายการที่เรียกว่า

android:layout_alignParentRight="true" 

ในRatingBarการประกาศของฉันใน XML แอตทริบิวต์นี้ป้องกันไม่ให้ตั้งค่าดาวที่ต้องการและตั้งค่าNumStars

โพสต์เกี่ยวกับปัญหาที่คุณพบ!


เพิ่งช่วยเพื่อนในสิ่งเดียวกัน ฉันแนะนำวิธีนี้และพบในภายหลังว่าไม่ถูกต้อง
AdamMc331

3

สำหรับฉันฉันมีปัญหาจนกว่าฉันจะถอดแผ่นรองออก ดูเหมือนว่ามีข้อบกพร่องในอุปกรณ์บางอย่างที่ไม่ได้ปรับเปลี่ยนขนาดของมุมมองเพื่อรองรับการขยาย แต่จะบีบอัดเนื้อหาแทน

ถอดpaddingใช้layout_marginแทน.


1

หากต้องการแสดงการจัดอันดับดาวอย่างง่ายในรูปทรงกลมให้ใช้รหัสนี้

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

แล้วใช้แบบนี้

button.setText (getIntToStar (4));


1

คุณสามารถเพิ่มคะแนนเริ่มต้นของห้าดาวที่ด้านข้างเลย์เอาต์ xml

android:rating="5"

แก้ไข:

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

โปรดชี้แจงด้วยตัวอย่างวิธีการเพิ่มสิ่งนี้ในรูปแบบ xml
Kurt Van den Branden

ฉันได้เพิ่มมุมมองที่สมบูรณ์แล้ว
Gaurav Shetty

1

หากคุณกำลังห่อRatingBarด้านในConstraintLayoutด้วยmatch_constraintสำหรับความกว้างตัวอย่างของตัวแก้ไขจะแสดงจำนวนดาวตามสัดส่วนกับความกว้างจริงไม่ว่าคุณจะตั้งค่าandroid:numStarsคุณสมบัติเป็นอย่างไร ใช้wrap_contentเพื่อดูตัวอย่างที่ถูกต้อง:

<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

ฉันพบว่าRatingBarจำนวนดาวที่ยืดออกไปเป็นจำนวนสูงสุดเนื่องจากอยู่ในตารางที่มีแอตทริบิวต์android:stretchColumns = "*"การขยายให้จำนวนสูงสุดของดาวเพราะมันถูกปิดล้อมอยู่ในตารางที่มีแอตทริบิวต์

เมื่อฉันลบstretchCoulumnsคอลัมน์ทั้งหมดแล้วRatingBarจะแสดงตามandroid:numStarsค่า


0

ความเป็นไปได้อีกประการหนึ่งคือคุณกำลังใช้ Rating ใน Adapter ของมุมมองรายการ

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

พารามิเตอร์ด้านล่างมีความจำเป็นเพื่อให้แอตทริบิวต์ทั้งหมดทำงานได้อย่างถูกต้อง:

  1. ตั้งค่าrootการparent
  2. บูลีนattachToRootเป็นfalse

เช่น convertView = inflater.inflate (R.layout.myId, parent, false);


0

สิ่งที่เกิดขึ้นจริงมากกว่าที่นี่คือการใช้แทนwrap_content match_parentหากคุณจะใช้match_parentเลย์เอาต์จะเต็มไปด้วยดาวแม้ว่ามันจะมากกว่าตัวแปรnumStarsก็ตาม


1
คุณช่วยยกตัวอย่างที่เป็นประโยชน์ได้ไหม
Alex L.

ใช่ในแมตช์พาเรนต์แสดง 8 ครั้ง แต่ในเนื้อหาสรุปแสดงให้เห็น 5
Vipin Sharma
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.