Android 原生提供 android.widget.RatingBar,支持星級顯示、觸摸交互、步長控制,完美適配評價場景。
<RatingBar
android:id="@+id/ratingbar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:numStars="5" <!-- 總星數 -->
android:rating="0" <!-- 默認評分 -->
android:stepSize="1" <!-- 步長:1=整星,0.5=半星 -->
android:isIndicator="false" <!-- true=僅顯示,false=可交互 -->
style="@style/Widget.AppCompat.RatingBar" /> <!-- 兼容主題 -->
public class MainActivity extends AppCompatActivity {
private RatingBar mRatingBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mRatingBar = findViewById(R.id.ratingbar);
// 監聽評分變化
mRatingBar.setOnRatingBarChangeListener(new RatingBar.OnRatingBarChangeListener() {
@Override
public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) {
// rating 為浮點數 (如 3.5, 4.0)
// fromUser 區分用戶觸摸 vs 代碼設置
Toast.makeText(MainActivity.this, "評價了 " + rating + " 星", Toast.LENGTH_SHORT).show();
// 【關鍵】接口傳值:轉換為整數/定點數
int score = Math.round(rating); // 四捨五入取整
// 或保留一位小數: int score10 = (int)(rating * 10); // 3.5 -> 35
submitScoreToServer(score);
}
});
}
private void submitScoreToServer(int score) {
// Retrofit/OkHttp/Volley 異步請求
// API: POST /api/rate { "target_id": 123, "score": score }
}
}
android:progressDrawable="@drawable/custom_rating_stars" (Layer-list 定義背景/次級/進度三層圖片)。stepSize="0.5" 或 0.1,配合 numStars="10" 實現 0.1 精度。android:isIndicator="true" + 代碼 setRating(3.5f)。styles.xml 定義 CustomRatingBar 統一全局風格 (顏色、大小、間距)。| 後端存儲類型 | 前端傳值策略 | 說明 |
|---|---|---|
| TINYINT (1-5) | Math.round(rating) | 整星制,四捨五入 |
| DECIMAL(2,1) (0.0-5.0) | rating (float) | 保留一位小數,直接傳浮點數 |
| INT (0-500) | (int)(rating * 100) | 避免浮點數精度問題,擴大 100 倍存整數 |
Theme.AppCompat,style 屬性是否正確。isIndicator="false",父佈局無 android:clickable="true" 攔截事件。fromUser 參數區分用戶操作與 setRating() 代碼觸發。RatingBar 是 Android 表單評分的標準組件,**XML 聲明 + 監聽器 + 數據轉換 + 異步提交** 四步走,即可完成從 UI 到接口的閉環。