Android Nougat (7.0 / API 24) OnRatingBarChangeListener 中的评分计数错误
Android Nougat (7.0 / API 24) rating count is wrong in OnRatingBarChangeListener
我在 Android 牛轧糖 (7.0) 中使用 RatingBar
并使用 OnRatingBarChangeListener
检测评级变化。
它在回调方法中给出了错误的评级值。所以假设如果我点击第二颗星它给我 3.0,如果我点击第四颗星它给我算作 5.0。
我注意到的另一件事是计数取决于我点击的确切位置。如果我点击星星的前半部分,它 returns 正确计数,如果我点击星星的后半部分,它会增加 +1 来计数。
ACTIVITY :
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 中的错误:https://issuetracker.google.com/issues/37114040
似乎唯一的解决方法是升级(如果您的 manufacturer/carrier 曾向您发布过升级)或使用某种自定义评级栏实现 API 24。
您可以通过以下方式有效地向后移植修复程序:
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。
我为这个问题写了一个非常简单的解决方法,在您的评分栏上,使用步骤作为 "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
我在 Android 牛轧糖 (7.0) 中使用 RatingBar
并使用 OnRatingBarChangeListener
检测评级变化。
它在回调方法中给出了错误的评级值。所以假设如果我点击第二颗星它给我 3.0,如果我点击第四颗星它给我算作 5.0。
我注意到的另一件事是计数取决于我点击的确切位置。如果我点击星星的前半部分,它 returns 正确计数,如果我点击星星的后半部分,它会增加 +1 来计数。
ACTIVITY :
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 中的错误:https://issuetracker.google.com/issues/37114040
似乎唯一的解决方法是升级(如果您的 manufacturer/carrier 曾向您发布过升级)或使用某种自定义评级栏实现 API 24。
您可以通过以下方式有效地向后移植修复程序:
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。
我为这个问题写了一个非常简单的解决方法,在您的评分栏上,使用步骤作为 "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