2012-11-21 32 views
5

Tôi có bố cục khung hình:đèo nhấp chuột sự kiện thông qua việc xem android

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_margin="10dp" > 

<LinearLayout 
    android:id="@+id/widgetView" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_gravity="center" 
    android:layout_margin="10dp" 
    android:gravity="center" > 
</LinearLayout> 

<LinearLayout 
    android:id="@+id/widgetOverlayFrame" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:clickable="false" > 
</LinearLayout> 

bố trí đầu chứa bố trí widget, và thứ hai là minh bạch và nhận onLongClick cho kéo công trình method.That, vấn đề là khi tôi muốn tương tác với tiện ích con, để nhấp vào nội dung nào đó, sự kiện nhấp được thực hiện bởi overlayFrame. Làm thế nào tôi có thể vượt qua sự kiện click trough overlayFrame để widgetView?

EDIT:

Bây giờ tôi đang cố gắng để đính kèm GestureLister để overlayFrame LinearLayout, bằng cách nào đó nhìn thấy sự khác biệt giữa MotionEvent đại diện cho nhấp chuột duy nhất và bấm dài. Các vấn đề mà tôi đang phải đối mặt là OnLongPress trong người nghe cử chỉ luôn được gọi là bất cứ điều gì tôi làm, nhấp chuột duy nhất hoặc nhấp chuột dài.

Có giải thích cho hành vi này không? Tnx!

Trả lời

0

Thay vì sử dụng GestureListener bạn có thể ghi đè lên onTouchListener theo cách này.

này sẽ gọi nhấn và giữ khi hết giờ và nếu một lên do thỏa thuận giữa nó sẽ hủy nhấn và giữ

CountDownTimer c; 
    long time=5000; 
    @Override 
    public boolean onTouchEvent(MotionEvent ev) { 
     switch (ev.getAction()) { 
      case MotionEvent.ACTION_DOWN: 
       c= new CountDownTimer(5000, 1000) { 
          public void onTick(long millisUntilFinished) { 
            time=millisUntilFinished; 
          } 

          public void onFinish() { 
           Log.i("","LONG PRESS"); 
          }}.start(); 

      break; 
      case MotionEvent.ACTION_UP: 
       if (time>0) { 
        Log.i("example","short click"); 
        c.cancel(); 
       } 
      break; 
     } 

     return true; 
    } 
+0

Ok, hoạt động cho phát hiện hoàn hảo ... làm thế nào bây giờ tôi vượt qua nhấp vào lớp bên dưới? – Veljko

+0

Tôi đã làm việc này một số cách ... tnx cho ý tưởng! – Veljko

0

Có thể đặt thuộc tính của lớp phủ android:focusable="false" hoặc android:focusableInTouchMode="false" là đủ.

Bạn cũng có thể tạo tiện ích lớp phủ của riêng mình và ghi đè phương thức onInterceptTouchEvent của mình để trả về lỗi luôn.

public class NotTouchableLinearLayout extends LinearLayout { 

    // Override constructors 
    // ... 

    @Override 
    public boolean onInterceptTouchEvent(MotionEvent ev) { 
     return false; 
    } 
} 
+0

Tôi đã thử cả hai, không có gì làm việc cho đến nay. Bạn có ý tưởng nào khác không? – Veljko

+0

Cố gắng ghi đè onTouch thay vì onInterceptTouchEvent. –

+0

hehe, tôi đã làm điều đó, nhưng bây giờ onLongClick trên overlayLayout không được gọi. Và tôi không thể kéo các mục. – Veljko

0

Thay vì thiết lập một GestureListener vào cách bố trí hàng đầu, bạn nên tạo đẳng cấp của riêng bạn mà kéo dài LinearLayout và ghi đè lên nó onTouchEvent phương pháp. Ở đó bạn có thể thực hiện logic của bấm dài \ ngắn bấm, vv

Các sự kiện nhấp chuột đầu tiên sẽ được gửi đến cách bố trí widget, và chỉ khi nó không xử lý (do đó nó là onTouchEvent lợi nhuận false), bạn sẽ đưa chúng lên bố cục trên cùng.

chỉnh sửa:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:layout_margin="10dp" > 

<LinearLayout 
android:id="@+id/widgetView" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:layout_gravity="center" 
android:layout_margin="10dp" 
android:gravity="center" > 
</LinearLayout> 

<com.example.touchtesting.MyLinearLayout 
android:id="@+id/widgetOverlayFrame" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:clickable="false" > 
</com.example.touchtesting.MyLinearLayout> 

</FrameLayout> 

thay đổi các com.example.touchtesting đến tên của gói của bạn. và đây là lớp:

 public class MyLinearLayout extends LinearLayout{ 

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

     private long startClick = 0; 

     @Override 
     public boolean onTouchEvent(MotionEvent ev) { 
      switch (ev.getAction()) { 
       case MotionEvent.ACTION_DOWN: 
        startClick = ev.getEventTime(); 
        break; 
       case MotionEvent.ACTION_CANCEL: 
       case MotionEvent.ACTION_UP: 
        if (ev.getEventTime() - startClick < 500) { 
         Log.i("example","short click"); 
        } 
        else { 
         Log.i("example","long click"); 
        } 
        break; 
      } 

      return true; 
     } 

    } 
+0

bạn có thể cung cấp một số mã không? – Veljko

+0

chỉnh sửa câu trả lời – Rotem

+0

tôi sẽ thử ngay bây giờ;) tnx ... nó làm cho sence ... hy vọng điều này hoạt động ... tôi đã mất một ngày với điều này. – Veljko

0

Để có được nhấp chuột nhiều thời gian để đi qua widgetView LinearLayout thêm android:longClickable="true". (Đối với nhấp chuột bình thường thêm android:clickable="true")

Vì vậy widgetView trở thành:

<LinearLayout 
    android:id="@+id/widgetView" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_gravity="center" 
    android:layout_margin="10dp" 
    android:gravity="center" 
    android:longClickable="true"> 
</LinearLayout> 
Các vấn đề liên quan