我在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"
/>
答案 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。