RatingBar 設置 style="?android:attr/ratingBarStyleSmall" 後,點擊星星無反應、評分不變;去掉 style 則正常。
系統內置樣式 ratingBarStyleSmall 可能包含 android:isIndicator="true" 或相關屬性,導致 RatingBar 變為「僅顯示指示器」模式,禁用用戶交互。
platforms/android-XX/data/res/values/styles.xml。ratingBarStyleSmall 定義,檢查是否含 <item name="android:isIndicator">true</item>。Log.d("TAG", "isIndicator=" + ratingBar.isIndicator());isIndicator(推薦)<!-- res/values/styles.xml -->
<style name="MyRatingBarSmall" parent="Widget.AppCompat.RatingBar.Small">
<item name="android:isIndicator">false</item> <!-- 關鍵:強制啟用交互 -->
<item name="android:stepSize">0.5</item>
<item name="android:numStars">5</item>
</style>
佈局中引用:style="@style/MyRatingBarSmall"
RatingBar rb = findViewById(R.id.ratingBar1);
rb.setIsIndicator(false); // 覆蓋樣式設置
rb.setOnRatingBarChangeListener(...);
<RatingBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:numStars="5"
android:stepSize="0.5"
android:rating="3"
android:progressDrawable="@drawable/custom_stars" />
?android:attr/...),其具體屬性因 API Level、廠商 ROM 而異,易引發隱性 Bug。styles.xml 定義**項目專屬樣式**,明確聲明所有關鍵屬性(isIndicator、stepSize、numStars、progressDrawable)。Layout Inspector 或 View.getLayoutParams() 確認最終生效屬性。| 現象 | 原因 | 修正 |
|---|---|---|
| 星星顯示不全/壓扁 | 父佈局寬度不足或 wrap_content 計算異常 | 給固定寬度或用 LinearLayout 分配權重 |
| 步長 0.5 但只能選整星 | 未設置 android:stepSize="0.5" | XML 或代碼設置 stepSize |
| 監聽器重複觸發 | setRating() 內部觸發回調 | 回調中判斷 fromUser 參數 |
核心原則:**顯式聲明交互屬性,不依賴系統樣式默認值**。