[英]Android RatingBar (filling next star)
我有以下评级栏:
<RatingBar
android:id="@+id/ratingBar"
android:layout_width="wrap_content"
android:layout_height="35dp"
android:numStars="5"
android:max="5"
android:stepSize="1.0"
android:layout_marginTop="12dp"/>
当我按下星星的左侧部分时 - 它被选中,但是当我按下右侧部分时 - 选择了下面的星星。 我需要我点击的星星被选中,无论我点击它的哪个部分。 请帮我理解什么是错的。
这可能是RatingBar
扩展ProgressBar
一个不幸的副作用,它在内部使用一个int
进程,舍入(而不是ceil
)从float
搜索位置转到int
进程。 我找到的最佳解决方案是将stepSize
设置为0.01
而不是1
,然后设置
rb.setOnRatingBarChangeListener( new RatingBar.OnRatingBarChangeListener() {
@Override
public void onRatingChanged( final RatingBar ratingBar, final float rating, final boolean fromUser ) {
if ( fromUser ) {
ratingBar.setRating( Math.ceil(rating) );
}
}
});
我花了很多时间试图在 Xamarin.Droid 中解决这个问题。 项目中使用的库似乎有点不同。 如果有人正在经历这个问题并且还没有能够解决它,这在这里解决了这个问题:
首先,我将stepSize设置为 0.01 。 然后我需要将Android.Widget.RatingBar导入Holder类,继承接口IOnRatingBarChangeListener并将方法OnRatingChanged实现为virtual 。 在该方法中,我进行了舍入,然后在 Event 中调用了该方法。
using static Android.Widget.RatingBar;
namespace Holder
{
public class Holder : RecyclerView.ViewHolder, IOnRatingBarChangeListener
{
public Question question;
public TextView tvQuestion;
public RatingBar rbRating;
public Holder(Android.Views.View itemView, OnRatingChangeListener listener) : base(itemView)
{
tvQuestion = (TextView)itemView.FindViewById(Resource.Id.tvQuestion);
rbRating = (RatingBar)itemView.FindViewById(Resource.Id.rbRating);
rbRating.RatingBarChange += (o, e) =>
{
OnRatingChanged(rbRating, rbRating.Rating, true);
listener.onRatingChange(question, rbRating.Rating);
};
}
public virtual void OnRatingChanged(RatingBar ratingBar, float rating, bool fromUser)
{
if (fromUser)
{
var newRating = (Math.Ceiling(rating));
ratingBar.Rating = (float)newRating;
}
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.