2010-08-06 40 views
5

Tôi có nút tùy chỉnh, mà tôi đang chụp onTouchEvent.Android: Nút tùy chỉnh OnClickListener không được gọi

public class CustomNumber extends ToggleButton { 
boolean drawGlow = false; 
float glowX = 0; 
float glowY = 0; 
float radius = 30; 


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


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


public CustomNumber(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
} 


Paint paint = new Paint(); 
{ 
    paint.setAntiAlias(true); 
    paint.setColor(Color.WHITE); 
    paint.setAlpha(70); 
}; 

@Override 
public void draw(Canvas canvas){ 
    super.draw(canvas); 
    if(drawGlow) 
     canvas.drawCircle(glowX, glowY, radius, paint); 
} 

@Override 
public boolean onTouchEvent(MotionEvent event){ 
    if(event.getAction() == MotionEvent.ACTION_DOWN){ 
     drawGlow = true; 
    }else if(event.getAction() == MotionEvent.ACTION_UP) 
     drawGlow = false; 
    } 
    glowX = event.getX(); 
    glowY = event.getY(); 
    this.invalidate(); 
    return true; 
} 

Nút tùy chỉnh này là một phần của lưới. Khi tôi thêm nút này vào lưới, tôi đã đặt OnClickListener cho nó. Tuy nhiên, mã trong OnClickListener không bao giờ được gọi.

đang GridAdapter, nơi tôi đang bổ sung thêm nút với người nghe:

public View getView(final int position, final View convertView, final ViewGroup parent) { 
    CustomNumber tBtn; 
    if (convertView == null) { 
     tBtn = new CustomNumber(context); 
     tBtn.setTextOff(""); 
     tBtn.setTextOn(""); 
     tBtn.setChecked(false); 
     tBtn.setId(position); 
     tBtn.setOnClickListener(tBtnListener); 
     tBtn.setLayoutParams(new GridView.LayoutParams(35, 35)); 
    } else { 
     tBtn = (CustomNumber) convertView; 
    } 
    return tBtn; 
} 

Xin vui lòng giúp.

+0

Nếu tôi xóa mã OnTouchEvent, khi đó mã OnClickListener hoạt động. Cả hai sự kiện không thể được xử lý cùng nhau ??? Hãy giúp tôi! – Pria

+1

không chắc chắn nhưng bất kỳ sự khác biệt nào cho dù bạn trả lại đúng hay sai trong onTouch của bạn ở cuối? –

+0

Tôi đã cố gắng trả về false từ onTouchEvent(). nó không hoạt động: (Hơn nữa, nó có sự kiện như MotionEvent.ACTION_DOWN luôn luôn – Pria

Trả lời

0

Tôi đoán nhận xét của Mathias là chính xác, bạn phải trả về false trong phương thức onTouchEvent khi bạn muốn trình nghe sự kiện onClick() được kích hoạt thay vì trình nghe sự kiện onTouch() tiếp theo.

Bạn có thể tìm thêm độ chính xác int UI Events documentation

+0

Tôi đã cố gắng trả về false từ onTouchEvent(). nó không hoạt động: (Hơn nữa, nó có sự kiện như MotionEvent.ACTION_DOWN luôn luôn – Pria

+0

ok, quên đi Sau đó bạn có chắc chắn rằng getView đặt onClickListener được gọi là? – Longfield

+0

ngay sau khi tôi nhận xét mã onTouchEvent của tôi ... mã onClickListener bắt đầu hoạt động :( – Pria

0

Bạn có thể chỉ thực thi mã của bạn trong OnTouchEvent (một nhấp chuột là MotionEvent.ACTION_DOWN như bạn đã biết)?

2

Hãy thử nhấn mạnh OnTouchListener trong hoạt động của bạn (thay vì onClickListener) và thay đổi onClick() thành onTouch(). Điều này làm việc cho tôi. Cả onTouchEvent từ chế độ xem tùy chỉnh của tôi và onTouch() từ Activity đều được gọi. Hãy nhớ trả lại "false" trong onTouch() và "true" trong OnTouchEvent của chế độ xem tùy chỉnh của bạn.

6

Thực hiện onTouchEvent của bạn, thay vì "return true;", làm ...

return super.onTouchEvent(event); 

Bạn đang trọng thực hiện các lớp cha đó là những gì có trách nhiệm kêu gọi người nghe. Bằng cách gọi triển khai của lớp cha, nó sẽ hoạt động như trước đây. Đây là lý do tại sao mã của bạn hoạt động khi bạn nhận xét phương thức - bởi vì bạn không còn ghi đè triển khai thực hiện của lớp bậc nhất

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