Cách đặt RatingBar để hiển thị năm sao


98

Tôi đang làm theo ví dụ tiêu chuẩn về cách thêm a RatingBar. Để kiểm soát số sao tôi đã cố gắng sử dụng android:numStars="5". Vấn đề là số lượng các ngôi sao dường như không có tác dụng gì cả. Trong bố cục dọc, tôi nhận được 6 sao và khi lật điện thoại, tôi nhận được khoảng 10 sao. Tôi đã cố gắng đặt số sao trong Activity ( myBar.setNumStars(5)) tải xml của mình nhưng cũng không thành công với tùy chọn đó.

Vì vậy, câu hỏi của tôi là làm cách nào để xác định bố cục của tôi để nó chỉ hiển thị năm sao? Thiết lập numStarsdường như không hoạt động.

Cảm ơn trước, Roland

Câu trả lời:


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

trong mã

mRatingBar.setRating(int)

120
Cảm ơn câu trả lời của bạn. Vấn đề là bạn không thể sử dụng android: layout_width = "fill_parent" vì ứng dụng RatingBar bỏ qua android: numStars othervise. : - /
Roland

3
Yêu cầu của tôi là thiết lập thanh đánh giá để điền vào cha mẹ hoặc phù hợp với cha mẹ nhưng sao cố định tức là 5. làm thế nào để làm điều đó? là nó có thể?
Prashanth Debbadwar

@PrashanthDebbadwar bạn đã thử 3 kích thước khác nhau trong thuộc tính "style" chưa? ví dụ ratingBarStyle
M. Usman Khan

65

Các RatingBar.setNumStartài liệu cho biết:

Đặt số lượng sao để hiển thị. Để những thứ này được hiển thị chính xác, bạn nên chiều rộng bố cục của tiện ích con này là nội dung bao bọc.

Vì vậy, thiết lập chiều rộng bố cục để wrap_contentgiải quyết vấn đề này.


25

Điều này phù hợp với tôi: RatingBarnên ở bên trong LinearLayoutngoài việc đặt chiều rộng bố cục để bao bọc nội dung RatingBar.


1
@ValentinGalea không quá xa lạ: thanh đánh giá quan tâm đến chiều rộng của chính nó, trong khi LinearLayout bên ngoài quan tâm đến việc lấp đầy chiều rộng bố cục mẹ của nó.
TechNyquist

13

Ngoài ra, nếu bạn đặt a layout_weight, điều này sẽ thay thế numStarsthuộc tính.


2
Điều này thực sự nên có trong tài liệu. Tôi thấy rằng thậm chí thêm một thiết lập đúng lề cũng ném ra numStars
Anton I. Sipos

Đây là lời khuyên tốt. Tôi đã loại bỏ đệm để cuối cùng làm cho nó hoạt động cho tôi.
Tha Leang

7

Bạn chỉ nên sử dụng numStars="5"trong XML của mình và thiết lập android:layout_width="wrap_content".
Sau đó, bạn có thể thử với các kiểu và các thứ khác, nhưng "wrap_content" trong layout_width mới là mẹo.


6

Nếu bạn đang sử dụng

android:layout_width="match_parent"

Sử dụng wrap_content và nó sẽ chỉ hiển thị numStars đã đặt :)

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

Định cấu hình số lượng Dấu sao trong tệp XML ... Không cần cung cấp nó trong Kiểu hoặc Hoạt động / Phân mảnh .... QUAN TRỌNG: Đảm bảo bạn Đặt WIDTH làm Nội dung và trọng số không được bật


5

Tôi cũng đang đối mặt với vấn đề vượt quá số sao so với số sao quy định. Đối với điều này, chúng tôi không muốn lo lắng về bất kỳ loại bố cục nào, bố cục tương đối hay tuyến tính. Chỉ cần sử dụng chiều rộng như sau:

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


Vui lòng tránh sử dụng match_parent và fill_parent cho thanh đánh giá .
Hy vọng những điều sẽ hữu ích.


3

Ngay cả khi tôi đang đối mặt với vấn đề @Roland, tôi đã bao gồm một thuộc tính nữa được gọi là

android:layout_alignParentRight="true" 

trong phần RatingBarkhai báo của tôi bằng XML. Thuộc tính này ngăn không cho thiết lập các sao bắt buộc và thiết lậpNumStars

Tiếp tục đăng về các vấn đề bạn gặp phải!


Chỉ giúp một người bạn với điều tương tự. Tôi đã đề xuất cách tiếp cận này và sau đó phát hiện ra rằng nó không hợp lệ.
AdamMc331 30/09/15

3

Đối với tôi, tôi đã gặp sự cố cho đến khi tôi loại bỏ phần đệm. Có vẻ như có lỗi trên một số thiết bị nhất định không làm thay đổi kích thước của chế độ xem để phù hợp với phần đệm và thay vào đó sẽ nén nội dung.

Loại bỏ padding, sử dụng layout_marginthay thế.


1

Để hiển thị xếp hạng sao đơn giản ở dạng hình tròn, chỉ cần sử dụng mã này

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

Và sử dụng nó như thế này

button.setText (getIntToStar (4));


1

Bạn có thể thêm xếp hạng mặc định là năm sao vào bên cạnh bố cục xml

android:rating="5"

Biên tập:

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

Vui lòng làm rõ với một ví dụ về cách thêm điều này vào bố cục xml.
Kurt Van den Branden

Tôi đã thêm chế độ xem hoàn chỉnh.
Gaurav Shetty

1

Nếu bạn đang bao bọc RatingBarbên trong a ConstraintLayoutvới match_constraintchiều rộng của nó, thì bản xem trước của trình chỉnh sửa sẽ hiển thị một số ngôi sao tỷ lệ với chiều rộng thực của nó, bất kể bạn đặt thuộc android:numStarstính nào. Sử dụng wrap_contentđể có được bản xem trước chính xác:

<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

Tôi nhận thấy rằng RatingBarsố lượng sao đã kéo dài đến tối đa vì nó nằm trong một Bảng có thuộc tính android:stretchColumns = "*".

Sau khi tôi gỡ stretchCoulumnsbỏ tất cả các cột, RatingBarhiển thị theo android:numStarsgiá trị


0

Một khả năng khác là bạn đang sử dụng Xếp hạng trong Bộ điều hợp của chế độ xem danh sách

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

Các thông số dưới đây là cần thiết để tất cả các thuộc tính hoạt động bình thường:

  1. Đặt rootthànhparent
  2. boolean attachToRootnhưfalse

Ví dụ: convertView = Inflater.inflate (R.layout.myId, parent, false);


0

Điều thực tế ở đây là sử dụng wrap_contentthay vì match_parent. Nếu bạn sử dụng match_parent, bố cục sẽ được lấp đầy bởi các ngôi sao ngay cả khi nó nhiều hơn biến numStars .


1
Bạn có thể cung cấp một số ví dụ hữu ích?
Alex L.

vâng, trên trận đấu cha mẹ, nó đã hiển thị bắt đầu 8, nhưng trên nội dung kết thúc, nó hiển thị 5
Vipin Sharma
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.