2017-07-14 15 views
1

私は作業中のRatingBar(「スターバー」として)を実装していますが、onRatingChanged()デリゲートメソッドを使用してうまくいっていますが、 APIにはブラインド)が表示されます。実際にはの変更がに変更されたときだけ、この1つのイベントが発生します。ユーザーが既に設定されているのと同じ星をタップしたときではありません。Android RatingBar:現在の評価と同じタップのハンドラーですか?

たとえば、評価バーに3/5の星の評価が表示されている場合、2または5回タップすると、onRatingChanged()が発生しますが、3回タップしても何も起こりません。

私はonTouchをキャプチャしており、それを(他のカスタムUIの目的のために)伝播できるようにしていますが、私はもちろんスターがタップされた参照を持っていません。私がした場合、私はそれを現在のgetRating()と比較し、 "同じ星タップ"のケースを扱うことができます。

他の誰もこれをまだ達成しようとしましたか、私が探索できる他の方法についてのヒントはありますか?私はRatingBar階層を上下に行ってきましたが、役立つものは何も表示されません。理想的にはonRatingChanged()は同じ評価でただ起動し、そこではそれを処理できます。 :/

ありがとうございます。下記のババンシュタインへ

UPDATE

おかげで、私は私のタッチイベントハンドラのACTION_UPチェックの新しい格付けチェック対私の現在の実行を遅延するのRunnableを使用して終了。それはかなりではありませんが、それは動作するようです(デバイス上に未定)。これはRatingBar自身のサブクラスIMPLである点に注意してください。

​​

答えて

1

タッチイベントが(touch_down)を開始したときにあなたが実際にこれが常に定格電流であるため、押しされているかの評価を知っています。

タッチイベントの後にレーティング変更機能が呼び出されるので、タッチアクションが開始する瞬間の評価をACTION_DOWNで確認し、タッチアクションが終了して少し後にレーティングをチェックするのはACTION_UPです。両方が同じであれば、同じ評価が与えられていることを知っています(現在の評価)。変更されている場合は、onChangeRatingリスナーがそれをキャッチします。

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でした)。 –

関連する問題