Nút Android đã gọi setOnTouchListener nhưng không ghi đè performanceClick


113

Khi tôi cố gắng thêm onTouchListner()vào một nút, nó giúp tôi

Nút đã gọi setOnTouchListener nhưng không ghi đè thực hiện

cảnh báo. Có ai biết làm thế nào để khắc phục nó?

1

btnleftclick.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View view, MotionEvent motionEvent) {
        return false;
    }
});

Lỗi:

Chế độ xem tùy chỉnh đã gọi setOnTouchListener nhưng không ghi đè performanceClick Nếu một Chế độ xem ghi đè onTouchEvent hoặc sử dụng OnTouchListener cũng không triển khai PerformClick và gọi nó khi nhấp chuột được phát hiện, Chế độ xem có thể không xử lý đúng các hành động trợ năng. Lý tưởng nhất là xử lý logic các hành động nhấp chuột trong Chế độ xem # thực hiện Nhấp chuột vì một số dịch vụ trợ năng gọi thực hiện Nhấp chuột khi một hành động nhấp chuột xảy ra.


Chế độ xem tùy chỉnh ImageViewđã gọi setOnTouchListener nhưng không ghi đè performanceClick Nếu một Chế độ xem ghi đè onTouchEvent hoặc sử dụng OnTouchListener cũng không triển khai PerformClick và gọi nó khi nhấp chuột được phát hiện, Chế độ xem có thể không xử lý đúng các hành động trợ năng. Lý tưởng nhất là xử lý logic các hành động nhấp chuột trong Chế độ xem # thực hiện Nhấp chuột vì một số dịch vụ trợ năng gọi thực hiện Nhấp chuột khi một hành động nhấp chuột xảy ra.
kas

Vui lòng xem câu trả lời của tôi tại đây: stackoverflow.com/questions/47170075/…
lambda,

Câu trả lời:


134

Cảnh báo này xuất hiện vì Android muốn nhắc bạn suy nghĩ về những người khiếm thị có thể đang sử dụng ứng dụng của bạn. Tôi khuyên bạn nên xem video này để biết tổng quan nhanh về điều đó.

Tất cả các chế độ xem giao diện người dùng tiêu chuẩn (như Button, TextViewv.v.) đều được thiết lập để cung cấp cho người dùng khiếm thị phản hồi thích hợp thông qua các dịch vụ Trợ năng. Khi bạn cố gắng tự xử lý các sự kiện chạm, bạn có nguy cơ quên cung cấp phản hồi đó. Đây là những gì cảnh báo dành cho.

Tùy chọn 1: Tạo chế độ xem tùy chỉnh

Xử lý các sự kiện chạm thông thường là việc được thực hiện trong chế độ xem tùy chỉnh. Đừng loại bỏ tùy chọn này quá nhanh. Nó không thực sự khó khăn. Dưới đây là một ví dụ đầy đủ về một TextViewcái được ghi đè để xử lý các sự kiện chạm:

public class CustomTextView extends AppCompatTextView {

    public CustomTextView(Context context) {
        super(context);
    }

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

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        super.onTouchEvent(event);

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                return true;

            case MotionEvent.ACTION_UP:
                performClick();
                return true;
        }
        return false;
    }

    // Because we call this from onTouchEvent, this code will be executed for both
    // normal touch events and for when the system calls this using Accessibility
    @Override
    public boolean performClick() {
        super.performClick();
        doSomething();
        return true;
    }

    private void doSomething() {
        Toast.makeText(getContext(), "did something", Toast.LENGTH_SHORT).show();
    }
}

Sau đó, bạn sẽ chỉ sử dụng nó như thế này:

<com.example.myapp.CustomTextView
    android:id="@+id/textview"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:padding="20dp"
    android:text="Click me to do something"/>

Xem câu trả lời khác của tôi để biết thêm chi tiết về cách tạo chế độ xem tùy chỉnh.

Tùy chọn 2: Tắt tiếng cảnh báo

Những lần khác, tốt hơn là bạn nên im lặng cảnh báo. Ví dụ: tôi không chắc bạn muốn làm gì với một Buttonsự kiện liên lạc mà bạn cần. Nếu bạn đã tạo ra một nút tùy chỉnh và kêu gọi performClick()trong onTouchEventnhư tôi đã làm ở trên cho tùy chỉnh TextView, sau đó nó sẽ được gọi là hai lần mỗi lần vì Buttonđã gọi performClick().

Dưới đây là một số lý do bạn có thể muốn bỏ qua cảnh báo:

  • Công việc bạn đang thực hiện với sự kiện cảm ứng của mình chỉ là hình ảnh. Nó không ảnh hưởng đến hoạt động thực tế của ứng dụng của bạn.
  • Bạn là người lạnh lùng và không quan tâm đến việc biến thế giới trở thành một nơi tốt đẹp hơn cho những người mù.
  • Bạn quá lười để sao chép và dán mã tôi đã cung cấp cho bạn trong Tùy chọn 1 ở trên.

Thêm dòng sau vào đầu phương pháp để loại bỏ cảnh báo:

@SuppressLint("ClickableViewAccessibility")

Ví dụ:

@SuppressLint("ClickableViewAccessibility")
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Button myButton = findViewById(R.id.my_button);
    myButton.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {
            return false;
        }
    });
}

1
Tôi đang sử dụng customviews vì sử dụng các phông chữ khác nhau. Như bây giờ trong Api 26 giới thiệu tính năng mới, phông chữ trong xml và cho phiên bản cũ hơn sử dụng thư viện hỗ trợ 26 hỗ trợ cho đến Api 16. Vì vậy, tôi đã xóa tất cả các chế độ xem tùy chỉnh. Và cảnh báo ngu ngốc này xuất hiện và giải pháp là tạo lại một số chế độ xem tùy chỉnh mà tôi đang sử dụng setOnTouchListener. hahaha: D Vì vậy, kỳ lạ
Shan Xeeshi

19
Tôi tự hỏi liệu google có nhận ra rằng họ đã lãng phí bao nhiêu giờ của nhà phát triển cho việc này không. Ý tôi là, họ có thể xử lý điều này trong api? dành thời gian phân lớp các lượt xem hoặc thậm chí tìm kiếm cách giải quyết cảnh báo của anh ấy gây lãng phí rất nhiều giờ.
TatiOverflow

điều gì xảy ra nếu bạn cần MotionEvent eventđối tượng trong doSomething()phương thức của mình ? Tôi cần phải kiểm tra event.getY().
Mateus Gondim

@MateusGondim, tôi phải nói rằng tôi vẫn chưa đủ năng lực triển khai performClick(). Suy nghĩ ban đầu của tôi là nếu event.getY()không tích hợp với sự kiện nhấp chuột thực tế (tức là hiệu ứng giao diện người dùng trực quan), thì hãy chuyển logic đó trở lại onTouchEvent(). Nếu không, bạn có thể tạo một biến thành viên lớp để lưu trữ Ygiá trị lên của hành động cuối cùng . Tôi cũng khuyên bạn nên kiểm tra mã nguồn để biết một số chế độ xem tiêu chuẩn để xem cách Android triển khai nó. Tôi cần tự nghiên cứu chúng nhiều hơn.
Suragch

1
@sisisisi, cảnh báo xuất hiện khi bạn ghi đè onTouchEvent()nhưng không performClick(). Điều đó có thể bao gồm vuốt hoặc nhấp hoặc bất kỳ sự kiện chạm nào khác mà bạn đang cố gắng nắm bắt.
Suragch

17

Giải pháp:

  1. Tạo một lớp mở rộng Nút hoặc bất kỳ chế độ xem nào bạn đang sử dụng và ghi đè PerformClick ()

    class TouchableButton extends Button {
    
        @Override
        public boolean performClick() {
            // do what you want
            return true;
        }
    }
  2. Bây giờ sử dụng TouchableButton này trong mã xml và / hoặc và cảnh báo sẽ biến mất!


18
Điều này thực sự là thô. Không có cách nào để sử dụng các chế độ xem hiện có?
Sữa

@Milk Không. android.widget.Buttonđược mã hóa cứng nên nó không cho phép bạn làm điều này. Và có vẻ như nó được đội ngũ nhà phát triển Android rất có chủ đích.
tom_mai78101

11

Bạn đã thử thêm:

view.performClick()

hoặc thêm chú thích chèn ép:

@SuppressLint("ClickableViewAccessibility")

?


2
Đúng. Sự xuất hiện của waring này với phiên bản android studio 3.0
kas

1
Được rồi, tôi có một giải pháp thay thế để khắc phục cảnh báo đó. xin vui lòng xem: stackoverflow.com/questions/47170075/...
lambda

1

Các điều khiển chế độ xem tùy chỉnh có thể yêu cầu hành vi sự kiện cảm ứng không chuẩn. Ví dụ: một điều khiển tùy chỉnh có thể sử dụng phương pháp trình nghe onTouchEvent (MotionEvent) để phát hiện các sự kiện ACTION_DOWN và ACTION_UP và kích hoạt một sự kiện nhấp chuột đặc biệt. Để duy trì khả năng tương thích với các dịch vụ trợ năng, mã xử lý sự kiện nhấp chuột tùy chỉnh này phải làm như sau:

Tạo AccessibilityEvent thích hợp cho hành động nhấp chuột được diễn giải. Bật các dịch vụ trợ năng để thực hiện hành động nhấp tùy chỉnh cho người dùng không thể sử dụng màn hình cảm ứng. Để xử lý các yêu cầu này một cách hiệu quả, mã của bạn nên ghi đè phương thức PerformClick (), phương thức này phải gọi phương thức siêu triển khai này và sau đó thực thi bất kỳ hành động nào được yêu cầu bởi sự kiện nhấp chuột. Khi hành động nhấp tùy chỉnh được phát hiện, mã đó sau đó sẽ gọi phương thức PerformClick () của bạn.

https://developer.android.com/guide/topics/ui/accessibility/custom-views#custom-touch-events

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.