Android RatingBar (заполнение следующей звезды)
У меня есть следующий RatingBar:
<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"/>
Когда я нажимаю на левую часть звезды - она выбирается, но когда я нажимаю на правую часть - выбирается следующая звезда. Мне нужна звезда, на которую я нажимаю, чтобы выбрать ту часть, на которую я щелкаю. Помогите мне пожалуйста понять что не так.
2 ответа
Это, возможно, неудачный побочный эффект 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 как виртуальный . Внутри метода я сделал округление, а затем вызвал метод внутри события .
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;
}
}
}
}