OnRatingBarChangeListener中的Android Nougat(7.0 / API 24)评级计数错误

时间:2017-06-03 09:34:16

标签: android ratingbar

我在Android Nougat(7.0)中使用RatingBar并使用OnRatingBarChangeListener来检测评级更改。

在回调方法中给出错误的评级值。所以假设如果我点击第二颗星它给我3.0,如果我点击第四颗星它给我数为5.0。

我注意到的另一件事是数量取决于我点击的确切位置。如果我点击星的前半部分它返回正确的计数,如果我点击星的后半部分,它会增加+1来计数。

Video link

活动:

RatingBar ratingBar = (RatingBar) findViewById(R.id.ratingBar2);

    ratingBar.setOnRatingBarChangeListener(new RatingBar.OnRatingBarChangeListener() {
      @Override public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) {

        Log.i(TAG, String.format("Rating is %f : fromUser %b", rating, fromUser));

        mTextView.setText(String.format("Rating is %f ", rating));
      }
    });

XML:

  <RatingBar
      android:id="@+id/ratingBar2"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:isIndicator="false"
      android:stepSize="1"
      android:rating="5"
      />

3 个答案:

答案 0 :(得分:9)

您可以通过执行以下操作有效地向后移植修补程序:

if (Build.VERSION.SDK_INT == Build.VERSION_CODES.N) { 
  try { 
    Field field = 
AbsSeekBar.class.getDeclaredField("mTouchProgressOffset"); 
    field.setAccessible(true); 
    field.set(mRatingBar, 0.6f); 
  } catch (NoSuchFieldException | IllegalAccessException e) {
    e.printStackTrace(); 
  } 
}

请参阅修复它的original commit

答案 1 :(得分:0)

这是API 24中的错误:https://issuetracker.google.com/issues/37114040

似乎唯一的解决方法是升级(如果您的制造商/运营商曾向您发布升级版)或使用某种自定义评级栏实现API 24。

答案 2 :(得分:0)

针对此问题,我写了一个非常简单的解决方法,在您的评分栏上,将step用作"0.1",在您的OnRatingBarChangeListener上使用此代码段;

int rating = (int)Math.Ceiling(args.Rating);
if (rating != args.Rating)
{
    ratingBar.Rating = rating;
    return;
} 

// now the rating will be the tapped star
// you can do what you must do here

p.s。我是在Xamarin.Android上编写的,但我很确定您可以通过更改ceil函数并使用setter作为RatingBar的等级来轻松地将其应用于Java。