Cảnh báo onTouchListener: onTouch sẽ gọi View # performanceClick khi phát hiện thấy một nhấp chuột


108

Tôi đã tạo ra một onTouchListener. Thật không may, onTouch () phương pháp cho throwstôi một cảnh báo:

com/calculator/activitys/Calculator$1#onTouch should call View#performClick when a click is detected

Nó có nghĩa là gì? Tôi không tìm thấy bất kỳ thông tin nào về cảnh báo này. Đây là mã đầy đủ:

LinearLayout llCalculatorContent = (LinearLayout) fragmentView.findViewById(R.id.calculator_content);

llCalculatorContent.setOnTouchListener(new View.OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        Tools.hideKeyboard(getActivity(), getView());
        getView().clearFocus();
        return false;
    }   
});

17
bạn muốn thoát khỏi cảnh báo chỉ cần gọi v.performClick(). Quá trình triển khai sẽ phát một chút âm thanh (nếu bạn đã bật nó trên thiết bị của mình) và gọi onClickListener, mà bạn có thể không ghi đè
Blackbelt

Câu trả lời của bạn đã đúng. Cảm ơn bạn
Trzy Gracje

Câu trả lời:


128

Của bạn đây:

public boolean onTouch(View v, MotionEvent event) {
    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:
        //some code....
        break;
    case MotionEvent.ACTION_UP:
        v.performClick();
        break;
    default:
        break;
    }
    return true;
}

14
Nó không nên được gọi chỉ khi sự kiện == MotionEvent.Action_UP, hoặc một cái gì đó tương tự? Ngoài ra, sẽ không trả về "false" thực sự gọi phương thức nhấp ban đầu, vì vậy bạn thực sự nên trả về "true" thay thế?
nhà phát triển android

@longilong Vâng, nếu bạn muốn bạn cũng có thể thiết lập nó để sử dụng chuyển đổi hợp cụ thể, nhưng đó là một cách logic như nhau ...
android phát triển

3
Tôi có một cảnh báo tương tự. Nhưng kịch bản của tôi hơi khác vì tôi đang đặt OnTouchListener ẩn danh khi thiết lập RecyclerView (gọi myRecyclerView.setOnTouchListener. Android Studio đang đánh dấu toàn bộ lớp ẩn danh bằng một cảnh báo tương tự và ngay cả khi tôi thêm v.performClick thì cảnh báo vẫn còn.
fr4gus

8
nếu chúng ta trả về false từ phương thức này, chúng ta không cần phải gọi performClick, phải không? Trong trường hợp này tôi không hiểu tại sao các cảnh báo lint vẫn còn đó
Jiechao Wang

9
Không có gì để sửa cảnh báo.
TheLibrarian

2

Bạn có thể ngăn chặn Lint

@SuppressLint("ClickableViewAccessibility")

Bạn nên gọi performClick()bên trong onTouchEvent().

@Override
public boolean onTouchEvent(MotionEvent event) {
    //A logic 

    performClick();
    return super.onTouchEvent(event);
}

hoặc là

findViewById(R.id.view1).setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {

        v.performClick();

        return v.onTouchEvent(event);
    }
});

OnTouch lưu lượng

Đọc thêm tại đây


1
Bạn không cần phải ghi đè performClick(). Vui lòng chia sẻ mã của bạn
yoAlex5

1

Trong trường hợp bạn không sử dụng Custom Viewmà nó ghi đè rõ ràng onPerformClick, cảnh báo sẽ không bị xóa khi chỉ làm theo câu trả lời của Secko.

Ngoài câu trả lời của anh ấy, để làm điều tương tự trên các lớp như android.widget.Buttonhoặc Buttonbạn cần tạo một chế độ xem tùy chỉnh đơn giản để mở rộng chế độ xem mục tiêu.

Thí dụ :

Lớp Chế độ xem Tùy chỉnh:

public class UselessButton extends AppCompatButton {
    public UselessButton(Context context) {
        super(context);
    }

    public UselessButton(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public UselessButton(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public boolean performClick() {
        return super.performClick();
    }
}

XML :

<stackoverflow.onEarth.UselessButton
    android:id="@+id/left"
    android:layout_width="60dp"
    android:layout_height="60dp"
    android:layout_marginStart="16dp"
    android:layout_marginTop="16dp"
    android:layout_marginEnd="8dp"
    android:layout_marginBottom="8dp"
    android:background="@drawable/left"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.16"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintBaseline_toBaselineOf="@+id/right"
    app:layout_constraintVertical_bias="0.5" />

Java :

    left.setOnTouchListener((v, event) -> {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            enLeft = 1;
            enRight = 0;
            return true;
        } else if (event.getAction() == MotionEvent.ACTION_UP) {
            enLeft = 0;
            v.performClick();
            return false;
        } else {
            return false;
        }
    });

Sự cố hiện tại: Cảnh báo đã được IDE giải quyết, nhưng không thể thấy hành động nhấp này thực tế thực hiện trên Thiết bị Android thực.

CHỈNH SỬA : Đã sửa lỗi nhận sự kiện nhấp chuột: Sử dụngView.setPressed(boolean)

down.setOnTouchListener((v, event) -> {
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        enFront = 0;
        enBack = 1;
        left.setPressed(true);
        return true;
    } else if (event.getAction() == MotionEvent.ACTION_UP) {
        enBack = 0;
        v.performClick();
        v.setPressed(false);
        return false;
    } else {
        return false;
    }

0

chỉ cần gọi phương thức PerformClick, như sau:

@Override
public boolean onTouch(View v, MotionEvent event) {
    v.performClick();
    Tools.hideKeyboard(getActivity(), getView());
    getView().clearFocus();
    return false;
}   

0

Tôi đã gặp vấn đề tương tự với a MultiTouchListenervà đã giải quyết nó bằng cách triển khai a GestureDetectorvà lắng nghe a SingleTap(Điều này không xóa cảnh báo nhưng bắt đầu kích hoạt onClickcác sự kiện trên chế độ xem của tôi)

class TouchListener(context: Context) : MultiTouchListener() {

    private var tochedView: View? = null
    private var mGestureDetector = CustomGestureDetector()
    private var gestureDetector: GestureDetector = GestureDetector(context, mGestureDetector)

    @SuppressLint("ClickableViewAccessibility")
    override fun onTouch(view: View?, event: MotionEvent?): Boolean {
        val aux = super.onTouch(view, event)

        tochedView = view
        gestureDetector.onTouchEvent(event)

        return aux
    }

    private inner class CustomGestureDetector: GestureDetector.SimpleOnGestureListener() {

        override fun onSingleTapUp(e: MotionEvent?): Boolean {
            // this will be called even when a double tap is
            tochedView?.performClick()
            return super.onSingleTapUp(e)
        }

        override fun onSingleTapConfirmed(e: MotionEvent?): Boolean {
            // this will only be called after the detector is confident that the
            // user's first tap is not followed by a second tap leading to a double-tap gesture.
            tochedView?.performClick()
            return super.onSingleTapConfirmed(e)
        }

    }

}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.