捕获RatingBar的点击事件

10

我好像在处理ratingbar点击时遇到了问题。评分条显示得很好,也有默认值,但问题是我无法更改任何值或启用它。我尝试了许多不同的方法(例如在布局中启用,在Java中完全构建等),但它们似乎都没有影响。这是我最新版本的评分条。我一定做错了什么以致于无法捕获点击。

Java代码:

  RatingBar showRatingBar = (RatingBar) findViewById(R.id.showRatingBar);
    showRatingBar.setEnabled(true);
    showRatingBar.setClickable(true);
    showRatingBar.setRating(0);
    showRatingBar.setOnRatingBarChangeListener(new RatingBar.OnRatingBarChangeListener(){
        @Override
        public void onRatingChanged(RatingBar ratingBar, float rating,
                boolean fromUser) {
            System.out.println("showRating.buildRatingBar:  " +rating);
            ratingBar.setRating(rating);

        }});
    showRatingBar.refreshDrawableState();

布局:

         <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <TextView
            android:id="@+id/showQualityLabel"
            android:layout_width="100dp"
            android:layout_height="wrap_content"
            android:text="@string/show_rating_label"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:textColor="#E6E6E6"
            android:textSize="12sp" />

        <RatingBar
            android:id="@+id/showRatingBar"
            style="?android:attr/ratingBarStyleSmall"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:max="5"
            android:numStars="5"
            android:rating="0"
            android:stepSize="1"/>
    </LinearLayout>

提前感谢您。

Craig

1个回答

34

setOnClickListener()方法不起作用的原因是,RatingBar重写了onTouchEvent()方法并且不会让View自己处理它,因此View#performClick() 方法从未被调用(这个方法会触发 OnClickListener)。

如果要解决这个问题,可以继承 RatingBar 并重写 onTouchEvent() 方法。

ratingBar.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if (event.getAction() == MotionEvent.ACTION_UP) {
                     float touchPositionX = event.getX();
                     float width = ratingBar.getWidth();
                     float starsf = (touchPositionX / width) * 5.0f;
                     int stars = (int)starsf + 1;
                     ratingBar.setRating(stars);

                     Toast.makeText(MainActivity.this, String.valueOf("test"), Toast.LENGTH_SHORT).show();                   
                     v.setPressed(false);
                }
                if (event.getAction() == MotionEvent.ACTION_DOWN) {
                    v.setPressed(true);
                }

                if (event.getAction() == MotionEvent.ACTION_CANCEL) {
                    v.setPressed(false);
                }




                return true;
            }});

2
不幸的是没有运气。我仍然无法让任何东西识别我的点击或评级中的任何更改。奇怪?!? - mornindew
我找到了一种方法,试试看吧 :) - Talha
太好了!就是这样。关键在于onTouch函数。非常感谢你。 - mornindew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接