2012-07-28 45 views
10

Tôi gặp sự cố khi phát hiện báo chí dài trong chế độ xem tùy chỉnh của mình.Nhấn và giữ Android

Dưới đây là đoạn code liên quan đến vấn đề này

final GestureDetector gestureDetector = new GestureDetector(new GestureDetector.SimpleOnGestureListener() { 
    public void onLongPress(MotionEvent e) { 
     Log.e("dbg_msg", "onLongPress"); 
    } 
}); 

public boolean onTouchEvent(MotionEvent event) { 
    return gestureDetector.onTouchEvent(event); 
}; 

Mã này phát hiện mỗi đơn (viết tắt) bấm bấm như lâu dài.

Khi tôi đặt mã này trong lớp được kế thừa từ Hoạt động, nó hoạt động.

Vậy tại sao nó không hoạt động trong Chế độ xem tùy chỉnh?

+0

Trở thành sự thật từ onTouchEvent cố định này đối với tôi – Manuel

Trả lời

23

Tất cả các mã này đi theo quan điểm của lớp tùy chỉnh của bạn:

public static int LONG_PRESS_TIME = 500; // Time in miliseconds 

final Handler _handler = new Handler(); 
Runnable _longPressed = new Runnable() { 
    public void run() { 
     Log.i("info","LongPress"); 
    } 
}; 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    switch(event.getAction()){ 
    case MotionEvent.ACTION_DOWN: 
     _handler.postDelayed(_longPressed, LONG_PRESS_TIME); 
     break; 
    case MotionEvent.ACTION_MOVE: 
     _handler.removeCallbacks(_longPressed); 
     break; 
    case MotionEvent.ACTION_UP: 
     _handler.removeCallbacks(_longPressed); 
     break; 
    } 
    return true; 
} 
+0

Cũng nên gọi removeCallbacks trên MotionEvent.ACTION_CANCEL. – kasgoku

+2

Bạn nên xóa ACTION_MOVE vì nó sẽ hủy trình xử lý. –

+1

Làm việc tốt ... !!! – InsaneCat

2

Tôi không chắc chắn nhưng hàm tạo của GestureDetector không được chấp nhận (here). Bạn có thể thử những cái khác cần ngữ cảnh như tham số đầu tiên không?

Xin lỗi tôi mới nên không thể đăng bình luận.

-Sửa -

Có vẻ như bạn sử dụng nghe khác, View.OnTouchListener này có phương pháp khác onTouch(). Bạn có thể thử lại không?

-Sửa -

Dưới đây là một ví dụ (làm việc cho tôi):

... 
mAnotherView.setOnTouchListener(new View.OnTouchListener() { 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     return mGestureDetector.onTouchEvent(event); 
    } 
}); 

... 
mGestureDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() { 

    @Override 
    public void onLongPress(MotionEvent e) { 
     // do your tasks here 
    } 
}); 
+0

Tôi đã thử điều đó quá, nhưng nó không hoạt động: ( –

+0

Làm thế nào để làm điều đó, tôi không giúp bạn? –

+1

Bạn được chào đón :-) Tôi nghĩ bạn có thể tự trả lời, để giúp người khác đọc câu hỏi của bạn. – Anh3Saigon

3

Bạn có cho phép ép dài trên GestureDetector của bạn? Bạn có thể kích hoạt nó hoặc bằng cách sử dụng một nhà xây dựng thích hợp, hoặc bằng cách gọi setIsLongpressEnabled. Ví dụ: bạn có thể làm:

gestureDetector.setIsLongpressEnabled(true); 

trong hàm tạo của bạn.

+1

Báo chí dài vẫn không hoạt động –

+0

bởi cơ hội Nó hoạt động cho tôi. cảm ơn +1 cho rằng –

0

Nó tốt hơn tôi đoán ..

public class Workflow extends View implements View.OnLongClickListener { 

public Workflow(Context context, DisplayFeatures d) { 
    super(context); 

    setLongClickable(true); 
    setOnLongClickListener(this); 
} 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    /* onTouchEvent should return super.onTouchEvent(event);, otherwise long click wouldn't be performed */ 
    return super.onTouchEvent(event); 
} 

@Override 
public boolean onLongClick(View v) { 
    Log.d("VIEW", "LONG CLICK PERFORMED!"); 
    return false; 
} 
} 
Các vấn đề liên quan