自定义视图RatingBar已调用setOnTouchListener,但不会覆盖performClick

Hri*_*dam 6 android ratingbar android-studio

我在我的布局中使用了RatingBar作为下面的1星 -

<RatingBar
            android:id="@+id/ratingBar"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:layout_below="@id/textViewReleaseDate"
            android:layout_marginLeft="16dp"
            android:layout_marginTop="16dp"
            android:layout_toRightOf="@id/imageViewPoster"
            android:numStars="1"
            android:stepSize="1.0" />
Run Code Online (Sandbox Code Playgroud)

并在我的活动中有setOnTouchListener,如下所示 -

ratingBar.setOnTouchListener(new View.OnTouchListener() {

        int ratingAtActionDown;

        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {

            if (motionEvent.getAction() == MotionEvent.ACTION_DOWN)
                ratingAtActionDown = (int) ratingBar.getRating();
            else if (motionEvent.getAction() == MotionEvent.ACTION_UP) {
                ratingBar.setRating(ratingAtActionDown == 0 ? 1 : 0);
            }

            return true;
        }
    });
Run Code Online (Sandbox Code Playgroud)

对于以上片段,我收到此警告 -

自定义视图'RatingBar'已调用setOnTouchListener,但不会覆盖performClick

在此输入图像描述

Android Studio 2.3.3 ratingBar.setOnTouchListener没有生成警告但在升级到Android Studio 3.0稳定后它开始警告.

应该怎么做才能摆脱警告?

spf*_*pfi 2

Lint 似乎错误地认为任何未实现该performClick()方法的视图都是自定义视图。知道了这一点,我们可以猜测受此警告影响的视图实际上缺少该实现。

现在回答您的问题,如果您希望警告消失,您可能需要扩展要设置 onTouchListener 的视图:

class TouchableRatingBar extends android.support.v7.widget.AppCompatRatingBar{

    public TouchableRatingBar(Context context) {
        super(context);
    }
    @Override
    public boolean performClick() {
        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

覆盖该performClick()方法,你应该可以开始了。

请注意,我使用了 AppCompatRatingBar,因为 Lint 似乎不喜欢这样做。

您可能还需要双重投射评级栏或更改其布局中的类型。

双演员:

TouchableRatingBar ratingBar = (TouchableRatingBar)(RatingBar)findViewById(R.id.ratingBar);
Run Code Online (Sandbox Code Playgroud)

我个人不会使用双重转换,但如果您需要有一个替代方案来简单地更改布局中的类型,它可能会完成这项工作。

类型变更:

<yourcompany.yourproject.TouchableRatingBar
            android:id="@+id/ratingBar"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:layout_below="@id/textViewReleaseDate"
            android:layout_marginLeft="16dp"
            android:layout_marginTop="16dp"
            android:layout_toRightOf="@id/imageViewPoster"
            android:numStars="1"
            android:stepSize="1.0" />
Run Code Online (Sandbox Code Playgroud)