2011-08-25 39 views
5

Vấn đề mô tả:Android :: OnTouchListener && OnClickListener vấn đề kết hợp

Tôi có một TextView trên RelativeLayout và tôi muốn màu nó đỏ khi người dùng chạm vào nó, và đi trên một trang khác khi ông nhấp chuột vào nó. Vì vậy, tôi đã cố gắng đặt OnClickListener để thực hiện nhấp chuột và OnTouchListener để triển khai chức năng cảm ứng (MotionEvent.ACTION_DOWN) nhưng kết hợp này không hoạt động, bởi vì OnTouchListener làm cho OnClickListener không hoạt động (không biết lý do).

Trên các diễn đàn người ta nói rằng chúng ta có thể thực hiện các OnClick bởi OnTouch MotionEvent.ACTION_UP, nhưng điều này có thể được kích hoạt ra khỏi TextView bố trí của tôi (TextView sẽ được bấm nếu bạn bấm nó và kéo ngón tay ra khỏi anh ta để phát hành) và đây không phải là hành vi mong muốn bởi vì tôi muốn:
nhấp = nhấn + phát hành trên TextView.

Ai đó có thể cho tôi giải pháp cho việc này không?

Trả lời

3

Adel, có phải là vấn đề với lần nhấp đầu tiên hay bạn không nhận được bất kỳ nhấp chuột nào?

Có vấn đề này nếu bạn có nhiều bố cục có thể nhấp mà bạn không nhận được bất kỳ sự kiện nhấp chuột nào cho lần đầu tiên. Đó là bởi vì nó làm cho nó được lựa chọn đầu tiên và sau đó bạn nhận được sự kiện bấm, hãy thử đoạn mã dưới đây.

private class CustomTouchListener implements OnTouchListener { 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     TextView tv = (TextView) v.findViewById(R.id.single_line_text); 
     if (event.getAction() == MotionEvent.ACTION_DOWN) { 
      tv.setTextColor(COLOR_WHEN_PRESSED); 
     } else if (event.getAction() == MotionEvent.ACTION_UP) { 
      tv.setTextColor(COLOR_WHEN_RELEASED); 
      // Action of click goes here 
     } else if (event.getAction() == MotionEvent.ACTION_CANCEL) { 
      tv.setTextColor(COLOR_WHEN_RELEASED); 
          // To handle release outside the layout region 
     } 
     return false; 
    } 
} 

Điều này đang làm việc trong triển khai hiện tại của tôi nếu bạn đặt trình xử lý cảm ứng cho bố cục của mình.

Bạn cũng cần phải thiết lập dưới đây về cách bố trí của bạn

android:focusable="true" 
android:focusableInTouchMode="true" 
android:clickable="true" 

Hy vọng nó giúp !!!

CHỈNH SỬA: Ngoài ra, phải có cờ ở cả XUỐNG và TÊN. Đặt nó trong XUỐNG và kiểm tra xem thiết lập của nó có được TĂNG không. Điều này sẽ tránh được một lỗi mà người dùng có thể chạm vào bất cứ nơi nào trên màn hình và sau đó di chuột trên chế độ xem văn bản của bạn và phát hành nó.

+0

Rất cám ơn! Bạn chắc chắn đã giúp tôi. Bí quyết đối với tôi là đặt ba thuộc tính bạn đã nêu ... – harsimranb

+0

Cảm ơn sự giúp đỡ! Tôi đã bỏ lỡ android: focusable = "true" trong TextView – Gatekeeper

21

bạn có thể gọi View.performClick() khi action_up. Hy vọng nó giúp.

your_txtView.setOnClickListener(new TextView.OnClickListener(){ 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 

     } 
    }); 

    your_txtView.setOnTouchListener(new TextView.OnTouchListener(){ 
      @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     if (MotionEvent.ACTION_DOWN == event.getAction()) { 

     } else if (MotionEvent.ACTION_UP == event.getAction()) { 
      v.performClick(); 
     } 

     return true; 
    } 
    }); 
+0

tôi có cùng một vấn đề ... và v.performClick làm việc đẹp ... đây là giải pháp ... vui lòng chấp nhận câu trả lời –

+0

+1, đây là những gì Tôi đang tìm kiếm. – tokudu

+0

Cảm ơn bạn đã bị sven. Điều này thật tuyệt. – aNoviceGuy

2

Có cùng vấn đề. Giải quyết nó bằng cách trả về false từ ACTION_MOVE. Tôi đã chiến đấu với nó trong vài giờ, cố gắng nhiều thứ khác nhau, nhưng có vẻ như tôi đã tiếp tục nhìn vào vấn đề nhỏ này ... Và bây giờ nó có ý nghĩa. Khi bạn trả về true từ onTouch, quá trình xử lý sẽ bị dừng lại, do đó OnClickListener không nhận biết được bất kỳ chuyển động nào và kích hoạt onClick ngay cả sau khi con trỏ đã di chuyển ra ngoài tầm nhìn.

+0

Thay mặt cho @ bugs99 không thể thêm nhận xét vì thiếu danh tiếng: Bằng cách thay đổi 'return true' thành' return false', bạn có thể thực hiện hành động 'onTouchListener()' và sau đó chuyển sự kiện chạm vào 'onClickListener()'.Với điều này, không cần phải thực hiện một cách rõ ràng 'performClick()' – gturri