繁体   English   中英

Android RatingBar(填充下一颗星)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM