Android: Tại sao nhấp dài cũng kích hoạt nhấp chuột bình thường?


126

Tôi có một ListView với người nghe cho một nhấp chuột dài và một nhấp chuột thường xuyên.

Tại sao, khi tôi nhấn một mục danh sách, sự kiện nhấp thường xuyên cũng được gọi?

Tôi cần phải có hai chức năng riêng biệt cho các nhấp chuột khác nhau.

Câu trả lời:


284

Từ người nghe sự kiện :

onLongClick () - Điều này trả về một boolean để cho biết bạn đã tiêu thụ sự kiện hay chưa và nó không nên được tiếp tục. Đó là, trả về true để chỉ ra rằng bạn đã xử lý sự kiện và nó sẽ dừng ở đây; trả về false nếu bạn chưa xử lý nó và / hoặc sự kiện sẽ tiếp tục với bất kỳ người nghe nhấp chuột nào khác.

Bạn đang trở về truetừ onLongClick()và vẫn nhận được sự kiện nhấp bình thường?

Đã chỉnh sửa để thêm : Đối với ListView, bạn có thể đang sử dụng OnItemLongClickListener. Ở onItemLongClick()đó sử dụng một giá trị trả về boolean tương tự để cho biết liệu nó có tiêu thụ sự kiện hay không.


1
Để đặt myListView.setOnItemLongClickListener(this); tùy chọn, bạn sẽ phải Ghi đè chức năng public boolean onItemLongClick(...). Ở đây bạn chỉ cần return truechỉ ra rằng LongClick đã được kích hoạt và sẽ hủy kích hoạt khi nhấp thường xuyên. Nếu bạn trả về false thì nó cũng sẽ kích hoạt nhấp chuột thường xuyên.
Brandon

Còn tình huống khác thì sao, khi tôi cần khác biệt giữa nhấp chuột dài và nhấp chuột bình thường để hành động theo đó
Muhammed Refaat

@erichamion Tôi đã thử giải pháp của bạn cho một vấn đề tương tự, không có may mắn. Tôi đánh giá cao bất kỳ hiểu biết hoặc suy nghĩ nào bạn có thể cung cấp, nằm ở đây: stackoverflow.com/questions/47783631/
mẹo

49

Khôi phục câu trả lời bằng các thuật ngữ đơn giản hơn:

Được:

@Override
public boolean onLongClick(View view) {

    return true; // or false
}
  • return truecó nghĩa là sự kiện được tiêu thụ. Nó được xử lý. Không có sự kiện nhấp chuột khác sẽ được thông báo.
  • return falsecó nghĩa là sự kiện không được tiêu thụ. Bất kỳ sự kiện nhấp chuột nào khác sẽ tiếp tục nhận được thông báo.

Vì vậy, nếu bạn không muốn onClickcũng được kích hoạt sau một onLongClick, thì bạn nên return truetừ onLongClicksự kiện.


2
Câu trả lời siêu hoàn hảo nếu chúng ta đặt giá trị thật thì nó chỉ xử lý nhấp chuột dài nếu chúng ta đặt sai thì cả hai lần nhấp và sự kiện báo chí dài xảy ra cùng một lúc
Pir Fahim Shah

Câu trả lời tuyệt vời.
Sam Chen

20

Hãy chắc chắn rằng bạn đang ghi đè OnClickListenercho onClickphương pháp của bạn . Cũng chắc chắn rằng bạn đang ghi đè OnLongClickListenercho onLongClickphương pháp của bạn . Và chắc chắn rằng onLongClickphương thức của bạn trả về true, vì điều này sẽ tiêu thụ onClick.


Tôi đã thêm đúng trong phương thức onLongClick của mình nhưng vẫn có một vấn đề là phương thức onClick của tôi không kích hoạt sau đó. Tôi sẽ đánh giá cao bất kỳ suy nghĩ hoặc ý tưởng nào về cách giải quyết, nằm ở đây: stackoverflow.com/questions/47783631/
mẹo

0

Bạn có thể thực hiện setOnLongClickListenerviệc tạo một thể hiện của new View.OnClickListener()hoặc new View.OnLongClickListener(), nếu bạn tạo một nhấp chuột dài và thực hiện OnclickListener bình thường, bạn sẽ nhận được các lỗi này của một lần nhấp khi kích hoạt phương thức. Bạn chỉ nên sử dụng new View.OnLongClickListener()để bắt những nhấp chuột dài

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.