2010-09-20 31 views
89

Trong các phương thức nghe android, hầu hết sự kiện sẽ trả về giá trị boolean. Giá trị đúng/sai là gì? điều gì sẽ dẫn đến các sự kiện sau đó?Ý nghĩa của giá trị boolean được trả về từ phương thức xử lý sự kiện trong Android

class MyTouchListener implements OnTouchListener { 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     logView.showEvent(event); 
     return true; 
    } 
} 

Đối với ví dụ trên, nếu trở thành sự thật trong onTouch phương pháp, tôi thấy tất cả các sự kiện liên lạc (DOWN, UP, DI CHUYỂN, vv) đã bị bắt theo logView tôi. Ngược lại, nếu trả về false, đúng là sự kiện DOWN đã bị bắt. Vì vậy, có vẻ như trả về false sẽ ngăn sự kiện truyền bá. Tôi có đúng không?

Ngoài ra, trong một OnGestureListener, nhiều phương pháp cũng phải trả lại giá trị boolean. Họ có cùng ý nghĩa không?

Trả lời

116

Nếu bạn trả lại true từ sự kiện ACTION_DOWN bạn quan tâm đến phần còn lại của sự kiện trong cử chỉ đó. "Cử chỉ" trong trường hợp này có nghĩa là tất cả các sự kiện cho đến ACTION_UP hoặc ACTION_CANCEL cuối cùng. Trả lại false từ một số ACTION_DOWN có nghĩa là bạn không muốn sự kiện và các chế độ xem khác sẽ có cơ hội xử lý nó. Nếu bạn có chế độ xem chồng chéo thì đây có thể là chế độ xem anh chị em. Nếu không nó sẽ bong bóng lên đến phụ huynh.

+3

adamp, có cách nào để tiếp tục nhận sự kiện VÀ để các sự kiện qua không? – ticofab

+0

@ticofab không, chỉ cha/mẹ của chế độ xem hiện đang nhận sự kiện mới có thể chặn các sự kiện trong tương lai trong cử chỉ. (Tất nhiên, bạn luôn có thể xây dựng hệ thống chuyển hướng của riêng bạn trong chế độ xem gốc, nhưng tôi sẽ không đề xuất nó trừ khi bạn thực sự biết mình đang làm gì.:)) – adamp

+0

@adamp Tôi không thể nghĩ ra lý do tại sao onTouch được gọi là 2 lần khi trả về true và 1 lần chỉ khi tôi trả về false. –

11

Giá trị boolean xác định xem sự kiện đó có được tiêu thụ hay không.

Có bạn đã đúng. Nếu bạn trả về false, người nghe tiếp theo sẽ xử lý sự kiện. Nếu nó trả về true, sự kiện này được người nghe của bạn tiêu thụ và không được gửi đến phương thức tiếp theo.

+2

Điều này là sai. 'true' có nghĩa là bạn đã tiêu thụ sự kiện và muốn phần còn lại của các sự kiện trong cử chỉ - những người nghe/lượt xem khác sẽ không nhận được sự kiện. 'false' có nghĩa là để người khác xử lý sự kiện. Nó thực sự là một chút cụ thể hơn mặc dù; xem câu trả lời của tôi – adamp

+0

Làm thế nào mà không chính xác những gì tôi đã nói? – Falmarri

+0

Những gì bạn nói bị đảo ngược. :) – adamp

1

Tôi mất gần một ngày để khắc phục sự cố, tôi vẫn phát hiện ra rằng chức năng onTouch của tôi được gọi 2 lần khi sử dụng đúng và 1 lần khi sử dụng sai.

+0

Bạn có thể tìm hiểu lý do không? –

+0

kiểm tra 'event.getAction()' vì nếu bạn trả về 'false' trên sự kiện ACTION_DOWN, sự kiện ACTION_UP bị bỏ qua bởi người nghe – doodeec

0

Từ Android-document:

Lưu ý: Android sẽ gọi xử lý sự kiện đầu tiên và sau đó xử lý mặc định thích hợp từ định nghĩa lớp thứ hai. Như vậy, việc trả về true từ các trình lắng nghe sự kiện này sẽ ngăn chặn sự truyền bá sự kiện tới các trình lắng nghe sự kiện khác và cũng sẽ chặn gọi lại tới trình xử lý sự kiện mặc định trong khung nhìn. Vì vậy, hãy chắc chắn rằng bạn muốn chấm dứt sự kiện khi bạn trả lại sự thật.

Các vấn đề liên quan