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

10

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

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

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

视频链接

活动:

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"
      />

我也遇到了同样的问题,但只出现在API 24中。这个问题在API 25中已经解决了。在API级别24中使用ratingbar有什么解决方法吗? - SuperStubbs
我目前还没有针对API 24的解决方案。我所做的是,如果API级别为24,则更改评分栏布局为星形图像,并在单击相同的情况下以某种方式管理视图。 - Nilesh Deokar
3个回答

11

你可以通过以下方式有效地将修复程序向后移植:

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(); 
  } 
}

查看修复此问题的原始提交


0

我为这个问题编写了一个非常简单的解决方法,在您的评分栏中,将步骤设置为"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

顺便说一下,我是用Xamarin.Android写的,但我相信你可以通过更改ceil函数并使用RatingBar的setter方法轻松地将其应用于Java。


0

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接