2017-06-30 20 views
5

Tôi gặp sự cố khi đặt tùy chỉnh ratingBar trong Java. Vấn đề là setNumStarssetRating không hoạt động. Tôi chỉ nhận được một ngôi sao trên màn hình được đánh dấu đầy đủ mặc dù tôi đã đặt tốc độ thành 0.0f.setNumStars và setRating không hoạt động trong tùy chỉnh RatingBar

Dưới đây là các mã:

DisplayMetrics metrics = new DisplayMetrics(); 
getWindowManager().getDefaultDisplay().getMetrics(metrics); 

chapter1 = new Chapter(this); 
android.widget.RelativeLayout.LayoutParams layoutParam = new RelativeLayout.LayoutParams(metrics.widthPixels , metrics.heightPixels); 
myLayout.addView(chapter1, layoutParam); 

for (int i = 0; i < 4; i++) { 
    for (int j = 0; j < 4; j++) { 
     RatingBar ratingBar = new RatingBar(this); 
     ratingBar.setProgressDrawable(ResourcesCompat.getDrawable(getResources(), R.drawable.custom_ratingbar_menu, null)); 
     ratingBar.setNumStars(3); 
     ratingBar.setRating(0.0f); 
     layoutParam = new RelativeLayout.LayoutParams(metrics.widthPixels/6 , metrics.heightPixels/32); 
     layoutParam.setMargins(70 + chapter1.getLeft() + wSize * j, 50 + chapter1.getTop() + hSize * i + (metrics.heightPixels/6), 0, 0); 
     myLayout.addView(ratingBar, layoutParam); 
    } 
} 

Và chúng ta đã sử dụng câu trả lời được chấp nhận trong How to create Custom Ratings bar in Android cho custom_ratingarbar_menu

Dưới đây là custom_ratingbar_menu:

<?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/customm_empty_menu" /> 
    <item android:id="@android:id/secondaryProgress" 
     android:drawable="@drawable/customm_empty_menu" /> 
    <item android:id="@android:id/progress" 
     android:drawable="@drawable/custom_full_menu" /> 
</layer-list> 

Và nó customm_empty_menu:

<?xml version="1.0" encoding="utf-8"?> 

<selector 
xmlns:android="http://schemas.android.com/apk/res/android"> 

    <item android:state_pressed="true" 
     android:state_window_focused="true" 
     android:drawable="@drawable/stars_off_menu" /> 

    <item android:state_focused="true" 
     android:state_window_focused="true" 
     android:drawable="@drawable/stars_off_menu" /> 

    <item android:state_selected="true" 
     android:state_window_focused="true" 
     android:drawable="@drawable/stars_off_menu" /> 

    <item android:drawable="@drawable/stars_off_menu" /> 

</selector> 

Và đây là custom_full_menu:

<?xml version="1.0" encoding="utf-8"?> 

<selector 
xmlns:android="http://schemas.android.com/apk/res/android"> 

    <item android:state_pressed="true" 
     android:state_window_focused="true" 
     android:drawable="@drawable/stars_on_menu" /> 

    <item android:state_focused="true" 
     android:state_window_focused="true" 
     android:drawable="@drawable/stars_on_menu" /> 

    <item android:state_selected="true" 
     android:state_window_focused="true" 
     android:drawable="@drawable/stars_on_menu" /> 

    <item android:drawable="@drawable/stars_on_menu" /> 

</selector> 
+1

Đọc https://stackoverflow.com/questions/5800657/how-to-create-custom-ratings-bar-in-android – Dennis

+0

Đồng thời đăng tệp 'custom_ratingbar_menu' của bạn cho vấn đề xếp hạng – Rehan

+0

@Ran đã hoàn thành ... ! –

Trả lời

3

Sửa Có một số vấn đề với thiết lập drawable tiến bộ trong mã. Công việc drawables của bạn khi được sử dụng trong XML. Vấn đề dường như xoay quanh việc thiết lập các thuộc tính thích hợp. Nếu tôi có thời gian, tôi có thể tìm hiểu thêm về điều này hoặc có thể ai đó có ý tưởng. (Kiểm tra XML của bạn, có một typo: "customm" thay vì "tùy chỉnh" Tôi đã sửa chữa nó dưới đây..)

(Đối với mức API 21 trở lên, bạn có thể làm như sau:

Trong MainActivity.java:

RatingBar ratingBar = new RatingBar(this, null, 0, R.style.myRatingBar); 

Trong styles.xml:.

<style name="myRatingBar" parent="@android:style/Widget.RatingBar"> 
    <item name="android:progressDrawable">@drawable/custom_ratingbar_menu</item> 
</style> 

Nhưng đây không phải là một giải pháp chung, vì vậy tôi thích sau)

Trong thời gian chờ đợi, bạn có thể thực hiện những gì bạn muốn bằng cách tăng RatingBar từ XML và thêm nó vào bố cục thay vì thực hiện new RatingBar(this). Bằng cách này, bạn có thể sử dụng các thuộc tính trong tệp XML. Điều này khắc phục sự cố của bạn.

Xác định một tập tin layout XML chứa chỉ là một thanh giá như sau:

rating_bar.xml

<?xml version="1.0" encoding="utf-8"?> 
<RatingBar xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/modelRatingBar" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:progressDrawable="@drawable/custom_ratingbar_menu" /> 

Các file drawable là nhiều như bạn định nghĩa chúng. Tôi sử dụng một biểu tượng khác vì tôi không có quyền truy cập đến máy của bạn:

custom_ratingbar_menu.xml

<?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/custom_empty_menu" /> 
    <item 
     android:id="@android:id/secondaryProgress" 
     android:drawable="@drawable/custom_empty_menu" /> 
    <item 
     android:id="@android:id/progress" 
     android:drawable="@drawable/custom_full_menu"> 
    </item> 
</layer-list> 

custom_empty_menu.xml

<?xml version="1.0" encoding="utf-8"?> 
<selector 
    xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_pressed="true" 
     android:state_window_focused="true" 
     android:drawable="@android:drawable/star_off" /> 
    <item android:state_focused="true" 
     android:state_window_focused="true" 
     android:drawable="@android:drawable/star_off" /> 
    <item android:state_selected="true" 
     android:state_window_focused="true" 
     android:drawable="@android:drawable/star_off" /> 
    <item android:drawable="@android:drawable/star_off" /> 

</selector> 

custom_full_menu.xml

<?xml version="1.0" encoding="utf-8"?> 
<selector 
    xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_pressed="true" 
     android:state_window_focused="true" 
     android:drawable="@android:drawable/star_on" /> 

    <item android:state_focused="true" 
     android:state_window_focused="true" 
     android:drawable="@android:drawable/star_on" /> 

    <item android:state_selected="true" 
     android:state_window_focused="true" 
     android:drawable="@android:drawable/star_on" /> 

    <item android:drawable="@android:drawable/star_on" /> 
</selector> 

Cuối cùng, hoạt động chính của onCreate():

MainActivity # onCreate

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    RelativeLayout myLayout = new RelativeLayout(this); 

    super.onCreate(savedInstanceState); 
    setContentView(myLayout); 
    // Your loop would go here... 
    RatingBar ratingBar = (RatingBar) getLayoutInflater() 
     .inflate(R.layout.rating_bar, myLayout, false); 
    myLayout.addView(ratingBar); 
    ratingBar.setNumStars(5); 
    ratingBar.setStepSize(0.5f); 
    ratingBar.setRating(2.0f); 
} 

Cũ câu trả lời, nhưng vẫn còn giữ.

Từ documentation for RatingBar:

Số lượng sao set (qua setNumStars (int) hoặc trong một layout XML) sẽ được hiển thị khi chiều rộng bố trí được thiết lập để wrap_content (nếu khác chiều rộng bố trí được thiết lập , kết quả có thể không thể đoán trước được).

Bạn đang làm như sau. (Chiều rộng và chiều cao không wrap_content.)

layoutParam = new RelativeLayout.LayoutParams(metrics.widthPixels/6 , metrics.heightPixels/32); 
myLayout.addView(ratingBar, layoutParam); 

Làm những điều sau đây, thay vào đó, có thể giúp bạn có được những gì bạn muốn, hoặc ít nhất, giúp bạn có được số lượng của các ngôi sao mà bạn muốn.

layoutParam = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,RelativeLayout.LayoutParams.WRAP_CONTENT); 
myLayout.addView(ratingBar, layoutParam); 

Tôi khuyên bạn nên bỏ qua tiến độ có thể rút ra trong lúc này và nhận số sao và xếp hạng ngay sau đó giới thiệu bản vẽ.

Nếu cách này không hiệu quả, bạn có thể đăng custom_ratingbar_menu không?

+1

Sau đó, nếu bạn muốn áp dụng bố cục tùy chỉnh cho RatingBar thì sao? – Athena

+0

Nó không hoạt động và tôi đã thực hiện chỉnh sửa mong muốn –

+0

@AryaSadeghi Xem câu trả lời được cập nhật. – Cheticamp

Các vấn đề liên quan