2017-07-14 29 views
1

我有一個RatingBar(作爲一個「星形條」)實現我正在處理,雖然我使用的代理方法使用onRatingChanged(),但有一個明顯的遺漏(或者我只是盲目地)在API中:只有這一個事件發生時,當評級實際上改變,而不是當用戶點擊它已經設置的相同星星時。例如,如果我在評級欄中顯示3/5星級評分,則點擊2或5組火災onRatingChanged()但點擊3完全沒有任何影響。Android RatingBar:與當前評分相同的同名明星處理程序?

我正在捕獲onTouch並允許它傳播(用於其他自定義UI目的),但我沒有提及當然選擇了哪顆星。如果我這樣做了,我可以將它與當前的getRating()進行比較,並處理「相同的星形分接」情況。

任何人都試圖完成這一點,或有任何提示,我可以探索其他方法?我已經在RatingBar層次結構上下了,並沒有看到任何有用的東西。理想的onRatingChanged()只會觸發相同的評級,我可以在那裏處理它。 :/

謝謝。

UPDATE

感謝巴斯麪包車斯坦下面,我結束了使用一個Runnable耽誤我的觸摸事件處理程序的ACTION_UP檢查我目前對新的分級檢查的執行。這不是很好,但它似乎工作(設備上的待定)。請記住,這是本身的RatingBar的子類IMPL:

​​

回答

1

你其實知道被按下的評級,因爲這始終是額定電流時,觸摸事件開始(touch_down)。

在兩次觸摸事件後都會調用等級更改功能,所以您應該在觸摸動作開始時檢查等級ACTION_DOWN以及觸摸動作結束後的等級ACTION_UP。如果兩者相同,則您知道已給出相同的評分(當前評分),如果已更改,您的聽衆將會聽到它。

private current_rating = 0; 
ratingBar.setOnTouchListener(new OnTouchListener() { 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     if (event.getAction() == MotionEvent.ACTION_DOWN) { 
      current_rating = ratingBar.getRating() 
     } 
     if (event.getAction() == MotionEvent.ACTION_UP) { 
      final Handler handler = new Handler(); 
      handler.postDelayed(new Runnable() { 
       @Override 
       public void run() { 
       if (current_rating == ratingBar.getRating()){ 
        //touched but no change between down and up, so fire the same rating. 
       } 
       } 
      }, 100); 
     } 
     return true; 
    } 
}); 
+0

希望它的作品,沒有自己驗證它。 –

+0

看起來理論上很好,但不幸的是我發現onRatingChanged在ACTION_UP事件之後纔會觸發。 :/ –

+0

作爲另一個複雜因素,我發現設置stepSize也會觸發onRatingChanged,因爲它會請求進度刷新(這是一個巨大的PITA,這使得難以測試您的答案) –

相關問題