我使用的是要充當一個指示器的自定義風格的RatingBar,但是我希望用戶仍然能夠點擊的RatingBar帶來了一個自定義對話框用的RatingBar那可以改變。的Android的RatingBar的按鈕時isIndicator =真
反正有沒有做到這一點,而不使用的圖像?
舉例說明:
我使用的是要充當一個指示器的自定義風格的RatingBar,但是我希望用戶仍然能夠點擊的RatingBar帶來了一個自定義對話框用的RatingBar那可以改變。的Android的RatingBar的按鈕時isIndicator =真
反正有沒有做到這一點,而不使用的圖像?
舉例說明:
對於那些誰是具有相同問題的道路,我想它了。
ratingBar = (RatingBar) findViewById(R.id.rbMyRating);
ratingBar.setIsIndicator(true);
ratingBar.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP) {
myRatingDialog.show();
v.setPressed(false);
}
if (event.getAction() == MotionEvent.ACTION_DOWN) {
v.setPressed(true);
}
if (event.getAction() == MotionEvent.ACTION_CANCEL) {
v.setPressed(false);
}
return true;
}
});
關鍵是你仍然可以使用setPressed爲true,即使isIndicator爲true。這將允許只允許RatingBar強調但不能改變。
您可以管理使用OnTouchListener的setPressed狀態。 ACTION_UP和ACTION_DOWN控制窗口小部件上的觸摸事件,ACTION_CANCEL處理窗口小部件以外的任何事件。
上述代碼的問題是它不支持按鍵事件。要做到這一點,需要以下額外代碼:
Float rating = 4f;
ratingBar.setFocusable(true);
ratingBar.setTag(rating);
ratingBar.setOnKeyListener(new OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN) {
if(keyCode == KeyEvent.KEYCODE_DPAD_CENTER || keyCode == KeyEvent.KEYCODE_ENTER) {
v.setPressed(false);
myRatingDialog.show();
} else if(keyCode == KeyEvent.KEYCODE_DPAD_LEFT) {
if (v.focusSearch(View.FOCUS_LEFT) != null) v.focusSearch(View.FOCUS_LEFT).requestFocus();
} else if(keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) {
if (v.focusSearch(View.FOCUS_RIGHT) != null) v.focusSearch(View.FOCUS_RIGHT).requestFocus();
}
}
return false;
}
});
ratingBar.setOnRatingBarChangeListener(new OnRatingBarChangeListener() {
@Override
public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) {
ratingBar.setRating((Float) ratingBar.getTag());
}
});
上面的代碼同時使用OnKeyListener和setOnRatingBarChangeListener。要啓用關鍵事件,您需要設置setFocusable(true)。您還需要手動連接KEYCODE_ENTER和KEYCODE_DPAD_CENTER的關鍵事件。
setFocusable = true的問題是您現在可以使用KEYCODE_DPAD_LEFT和KEYCODE_DPAD_RIGHT更改RatingBar評級。要解決此問題,請使用onRatingBarChangeListener重置RatingBar的評分。您可以將評分存儲在RatingBar的標籤中。請記住,當您通過對話框更改評分時,您需要更改標籤值。
由於使用onRatingBarChangeListener你現在將面臨一個最後一個問題的結果。既然你是自動更改等級,用戶將不能夠專注與KEYCODE_DPAD_LEFT和KEYCODE_DPAD_RIGHT其他UI元素。要解決這個問題,只需使用OnKeyListener檢測左右DPad動作並使用searchFocus和requestFocus更改焦點。請記住,如果沒有找到UI元素,searchFocus將返回null。
希望這有助於別人誰運行到這個問題。 :)
你可以在一個相對佈局添加您的RatingBar並用一個透明的按鈕
<RelativeLayout
android:layout_width:"match_parent"
android:layout_height:"wrap_content" >
<RatingBar
android:layout_width:"wrap_content"
android:layout_height:"wrap_content"
android:numStars="5"
android:isIndicator="true" />
<Button
android:layout_width:"match_parent"
android:layout_height:"wrap_content"
android:background:"@android:color/transparent" />
</RelativeLayout>
覆蓋它,那麼你的按鈕添加監聽器。