2011-09-12 29 views
8

Tôi có chế độ xem tùy chỉnh hoạt động như một nút. Tôi muốn thay đổi nền khi người dùng nhấn vào nó, hoàn nguyên nền ban đầu khi người dùng di chuyển ngón tay ra ngoài hoặc nhả ngón tay ra và tôi cũng muốn xử lý các sự kiện onClick/onLongClick. Vấn đề là onTouch yêu cầu tôi trả lại giá trị đúng cho ACTION_DOWN hoặc nó sẽ không gửi cho tôi sự kiện ACTION_UP. Nhưng nếu tôi trả lại đúng, người nghe onClick sẽ không hoạt động.Android onTouch với onClick và onLongClick

Tôi nghĩ rằng tôi đã giải quyết nó bằng cách trả về false trong onTouch và đăng ký onClick - nó bằng cách nào đó đã hoạt động, nhưng lại chống lại các tài liệu. Tôi vừa nhận được một tin nhắn từ một người sử dụng nói với tôi rằng anh ấy không thể bấm nút lâu, vì vậy tôi tự hỏi có gì sai ở đây.

Một phần của mã hiện tại:

public boolean onTouch(View v, MotionEvent evt) 
{ 
    switch (evt.getAction()) 
    { 
    case MotionEvent.ACTION_DOWN: 
    { 
     setSelection(true); // it just change the background 
     break; 
    } 

    case MotionEvent.ACTION_CANCEL: 
    case MotionEvent.ACTION_UP: 
    case MotionEvent.ACTION_OUTSIDE: 
    { 
     setSelection(false); // it just change the background 
     break; 
    } 
    } 

    return false; 
} 

public void onClick(View v) 
{ 
    // some other code here 
} 

public boolean onLongClick(View view) 
    { 
    // just showing a Toast here 
    return false; 
    } 


// somewhere else in code 
setOnTouchListener(this); 
setOnClickListener(this); 
setOnLongClickListener(this); 

Làm thế nào để làm cho họ làm việc cùng nhau một cách chính xác?

Cảm ơn trước

Trả lời

10

onClick & onLongClick thực sự là phái từ View.onTouchEvent.

nếu bạn ghi đè View.onTouchEvent hoặc đặt một số cụ thể View.OnTouchListener qua setOnTouchListener, bạn phải quan tâm đến điều đó.

để mã của bạn phải như sau:

 
public boolean onTouch(View v, MotionEvent evt) 
{ 
    // to dispatch click/long click event, 
    // you must pass the event to it's default callback View.onTouchEvent 
    boolean defaultResult = v.onTouchEvent(evt); 

    switch (evt.getAction()) 
    { 
    case MotionEvent.ACTION_DOWN: 
    { 
     setSelection(true); // just changing the background 
     break; 
    } 
    case MotionEvent.ACTION_CANCEL: 
    case MotionEvent.ACTION_UP: 
    case MotionEvent.ACTION_OUTSIDE: 
    { 
     setSelection(false); // just changing the background 
     break; 
    } 
    default: 
     return defaultResult; 
    } 

    // if you reach here, you have consumed the event 
    return true; 
} 
Các vấn đề liên quan