【问题标题】:Android RatingBar (filling next star)Android RatingBar(填充下一颗星)
【发布时间】:2021-08-13 00:58:54
【问题描述】:

我有以下 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"/>

当我按下星的左侧时 - 它被选中,但当我按下右侧时 - 下一个星被选中。我需要点击我点击的星号来选择我点击的任何部分。 请帮助我了解问题所在。

【问题讨论】:

标签: android ratingbar


【解决方案1】:

这可能是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) );
        }
    }
});

【讨论】:

  • 完美!感谢您的宝贵时间!
  • 这应该是选择的答案
  • 出现错误 - RatingBar 中的 setRating(float) 不能应用于 (double)
【解决方案2】:

我花了很多时间试图在 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;
            }
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    • 2015-05-23
    • 1970-01-01
    • 2013-10-19
    • 1970-01-01
    相关资源
    最近更新 更多