2012-04-06 41 views
18

Trong đơn đăng ký của tôi, tôi muốn nhận được sự kiện liên lạc của tất cả chế độ xem của trẻ em trong chế độ xem của cha mẹ là onTouchListener nhưng tôi không thể nhận được thông báo này.Làm cách nào để sử dụng sự kiện liên lạc của chế độ xem của trẻ trong danh sách liên lạc của chế độ xem của phụ huynh?

Ví dụ:

Theo quan điểm hoạt động của tôi của tôi có một bố cục khung hình trong đó có một số nút và edittexts trong đó. Vì vậy, bất cứ khi nào tôi chạm vào nút hoặc chỉnh sửa văn bản, tôi muốn nhận sự kiện chạm này trong của framlayoutonTouchListeners.

Đây là mã của tôi ..

Hoạt động:

private FrameLayout rootView; 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     rootView = (FrameLayout) findViewById(R.id.rootview); 
     rootView.setOnTouchListener(new OnTouchListener() 
     { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) 
      { 
       Log.e("Touch Event: ", " X: " + event.getX() + " Y: " + event.getY()); 
       return false; 
      } 
     }); 
     } 

main.xml:

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:padding="10dip" 
    android:id="@+id/rootview"> 

<LinearLayout 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:background="@android:color/white" 
    android:orientation="vertical" 
    android:layout_gravity="center" 
    android:padding="10dip"> 

    <TextView 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_gravity="center" 
        android:padding="4dp" 
        android:text="Login" 
        android:textColor="@android:color/black" 
        android:textSize="16dp" 
        android:textStyle="bold" /> 

       <TextView 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:layout_marginTop="10dp" 
        android:text="Username" 
        android:textColor="@android:color/black" 
        android:textSize="14dp" 
        android:textStyle="bold" /> 

       <EditText 
        android:id="@+id/edttextusername" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:imeOptions="flagNoExtractUi" 
        android:singleLine="true" /> 

       <TextView 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:layout_marginTop="10dp" 
        android:text="Password" 
        android:textColor="@android:color/black" 
        android:textSize="14dp" 
        android:textStyle="bold" /> 

       <EditText 
        android:id="@+id/edttextpassword" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:imeOptions="flagNoExtractUi" 
        android:password="true" /> 

       <LinearLayout 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:layout_gravity="center" 
        android:gravity="center" 
        android:orientation="horizontal" 
        android:padding="10dp" > 

        <Button 
         android:id="@+id/btnlogin" 
         android:layout_width="0dip" 
         android:layout_height="40dip" 
         android:layout_marginRight="5dp" 
         android:layout_weight="1" 
         android:enabled="false" 
         android:text="Login" 
         android:padding="5dip" 
         android:textColor="@android:color/black" 
         android:textStyle="bold" 
         /> 

        <Button 
         android:id="@+id/btncall" 
         android:layout_width="0dip" 
         android:layout_height="40dip" 
         android:layout_marginLeft="5dp" 
         android:layout_weight="1" 
         android:padding="5dip" 
         android:text="Cancel" 
         android:textColor="@android:color/black" 
         android:textStyle="bold" /> 
       </LinearLayout> 


</LinearLayout> 

    </FrameLayout> 

Vấn đề: Vì vậy whenver tôi chạm vào nút hoặc EditText Tôi không thể liên lạc được với bố cục của tôi trong onTouchLi stener (Nó không được gọi).

Lưu ý: Tôi không muốn thêm onTouchListener riêng cho tất cả các childViews.

Xin cảm ơn trước.

Trả lời

3

Tôi đã thử thiết kế tương tự với (chỉ một onTouch Listener trên root FrameLayout) và nó hoạt động. Tôi nhận được tất cả các điểm được cung cấp rằng onTouch trả về true thay vì sai. Nếu không, tôi chỉ nhận được điểm đầu tiên. Tôi không thể tìm ra lý do cho vấn đề "trả lại" này vì tôi mong đợi hành vi ngược lại.

Tuy nhiên, dựa trên kinh nghiệm của tôi, nếu bạn đặt bất kỳ chế độ xem con nào có thể nhấp, thì onTouch của cha mẹ sẽ không hoạt động. Nếu bạn có một giải pháp khác và nếu bạn chia sẻ, điều đó sẽ tuyệt vời.

22

Bạn có thể thực hiện điều đó bằng cách ghi đè dispatchTouchEvent trong bố cục.

public class MyFrameLayout extends FrameLayout { 
    @Override 
    public boolean dispatchTouchEvent(MotionEvent e) { 
     // do what you need to with the event, and then... 
     return super.dispatchTouchEvent(e); 
    } 
} 

Sau đó sử dụng bố trí mà ở vị trí của FrameLayout thông thường:

<com.example.android.MyFrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:padding="10dip" 
    android:id="@+id/rootview"> 
    ... 

Bạn cũng có thể bỏ qua cuộc gọi siêu hoàn toàn nếu bạn cần để ngăn chặn views con từ khi nhận được sự kiện này, nhưng tôi nghĩ rằng sẽ này hiếm. Nếu bạn cần phải tạo một số người, nhưng không phải tất cả, các chức năng mặc định, có rất nhiều để viết lại:

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.1.1_r1/android/view/ViewGroup.java#ViewGroup.dispatchTouchEvent%28android.view.MotionEvent%29

2

2 giải pháp:

  1. Sử dụng onInterceptTouchEvent trên ViewGroup, như thể hiện here

  2. Tránh bố cục xử lý các sự kiện chạm và có chế độ xem là chế độ xem con của bố cục, bao gồm toàn bộ kích thước, để xử lý các sự kiện chạm.

    Nó không hiệu quả như mở rộng lớp học, nhưng dễ dàng hơn nhiều và không yêu cầu tạo tệp/lớp mới.

    dụ:

    Chỉ cần thêm sự kiện chạm đến quan điểm, và nó sẽ xử lý chúng để thay thế bất kỳ quan điểm khác.

-1

Có thể đạt được điều này bằng cách sử dụng "onInterceptTouchEvent". Vui lòng thử điều này, nó có thể hoạt động

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

Bạn không nên gọi thủ công theo phương pháp TouchEvent ... – Crisic

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