4

我的问题是当我再次评价相同的值时,它第二次没有响应。这意味着当我第一次评价“4”时,我第二次不能评价为“4” ..它仅在我评价其他值而不是“4”时才会响应。

这是我尝试过的(我需要getRatingBar在我的代码中执行操作)。

public class InteractiveRatingBarActivity extends Activity implements
       OnRatingBarChangeListener {
   RatingBar getRatingBar;
   RatingBar setRatingBar;
   TextView countText;
   int count;
   float curRate;

   /** Called when the activity is first created. */
   @Override
   public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);

       findViewsById();

       setRatingBar.setRating(curRate);//overall rating
       getRatingBar.setOnRatingBarChangeListener(this);// ratingbar for user action. 

   }   

   private void findViewsById() {
       getRatingBar = (RatingBar) findViewById(R.id.getRating);
       setRatingBar = (RatingBar) findViewById(R.id.setRating);
       countText = (TextView) findViewById(R.id.countText);
   }


   public void onRatingChanged(RatingBar rateBar, float rating,
           boolean fromUser) {
       DecimalFormat decimalFormat = new DecimalFormat("#.#");
       curRate = Float.valueOf(decimalFormat.format((curRate * count + rating)
               / ++count));
       Toast.makeText(InteractiveRatingBarActivity.this,
               "New Rating: " + curRate, Toast.LENGTH_SHORT).show();
       setRatingBar.setRating(curRate);
       countText.setText(count + " Ratings");
   }


}

提前致谢

4

2 回答 2

5

发生这种情况是因为您有 OnRatingChange (如果它保持不变,您的评级不会改变,因此不会调用此方法)。

您可以开发一个 OnTouchListen:

ratingBar.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if (event.getAction() == MotionEvent.ACTION_UP) {
                    float touchPositionX = event.getX();
                    float width = ratingBar.getWidth();
                    float starsf = (touchPositionX / width) * 5.0f;
                    int stars = (int) starsf + 1;

                    DecimalFormat decimalFormat = new DecimalFormat("#.#");
                    curRate = Float.valueOf(decimalFormat.format((curRate
                            * count + starsf)
                            / ++count));
                    Toast.makeText(InteractiveRatingBarActivity.this,
                            "New Rating: " + curRate, Toast.LENGTH_SHORT)
                            .show();
                    setRatingBar.setRating(curRate);
                    countText.setText(count + " Ratings");
                    v.setPressed(false);
                }
                if (event.getAction() == MotionEvent.ACTION_DOWN) {
                    v.setPressed(true);
                }

                if (event.getAction() == MotionEvent.ACTION_CANCEL) {
                    v.setPressed(false);
                }

                return true;
            }
        });
于 2013-09-10T10:42:49.840 回答
1

当评分栏发生变化时,您不能调用 onRatingChanged() 方法。也就是说,当您两次单击相同的评分时,它可能不会更改评分栏,因此无法调用 onRatingChanged() 中的函数.另一种可能的方法是在每次调用 onRatingChanged() 之后调用 oncreate 。但是它不应该在评级栏中显示以前的费率。

更新:
假设你在里面做的任何事情都onRatingChanged()被包装到一个函数中,processing(). 您最可能需要的是更改后的评级。所以我们将它作为参数传递给函数。尝试以下方式

            float newRating;
    myRatingBar.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

        newRating=myRatingBar.getRating();
        processing(newRating);   

        }
    });
于 2013-09-11T09:06:07.360 回答