2012-02-12 45 views
2

我使用的是要充當一個指示器的自定義風格的RatingBar,但是我希望用戶仍然能夠點擊的RatingBar帶來了一個自定義對話框用的RatingBar那可以改變。的Android的RatingBar的按鈕時isIndicator =真

反正有沒有做到這一點,而不使用的圖像?

舉例說明:

RatingBar Highlighed

回答

2

對於那些誰是具有相同問題的道路,我想它了。

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。

希望這有助於別人誰運行到這個問題。 :)

0

你可以在一個相對佈局添加您的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> 

覆蓋它,那麼你的按鈕添加監聽器。