2012-04-06 11 views
18

मेरे आवेदन में मैं अपने मूल दृश्य के onTouchListener में सभी बच्चे के दृश्यों की स्पर्श घटना प्राप्त करना चाहता हूं लेकिन मुझे यह नहीं मिला।अभिभावक दृश्य के टचलिस्टर में बाल दृश्य के स्पर्श ईवेंट का उपभोग कैसे करें?

उदाहरण:

मेरी गतिविधि के विचार में मैं एक फ्रेम लेआउट जो इसमें कुछ बटन और edittexts है की है। इसलिए जब भी मैं बटन स्पर्श करता हूं या पाठ संपादित करता हूं, मैं फ़्रेमलेआउट केonTouchListeners में इस स्पर्श ईवेंट को प्राप्त करना चाहता हूं।

यहाँ मेरी कोड है ..

गतिविधि:

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> 

समस्या: तो whenver मैं बटन या स्पर्श edittext मैं अपने फ्रेम लेआउट के टचली में टच सह-समन्वय नहीं प्राप्त कर सकता हूं स्टेनर (इसे नहीं कहा जाता है)।

नोट: मैं सभी बच्चे दृश्यों के लिए अलग-अलग टचलिस्टर को जोड़ना नहीं चाहता हूं।

अग्रिम धन्यवाद।

उत्तर

3

मैंने इसी तरह के डिज़ाइन की कोशिश की है (रूट फ्रेमलेआउट पर केवल एक टच श्रोता) और यह काम करता है। मुझे प्रदान किए गए सभी बिंदु मिलते हैं कि झूठ के बजाय टच वापसी सच है। अन्यथा, मुझे बस पहला बिंदु मिलता है। मुझे इस "वापसी" मुद्दे का कारण नहीं मिला क्योंकि मैं विपरीत व्यवहार की अपेक्षा करता हूं।

हालांकि, मेरे अनुभव के आधार पर, यदि आप किसी भी बच्चे के दृश्य को क्लिक करने योग्य सेट करते हैं, तो उसके माता-पिता का टच काम नहीं करेगा। यदि आपके पास कोई दूसरा समाधान है और यदि आप साझा करते हैं, तो यह बहुत अच्छा होगा।

22

लेआउट में dispatchTouchEvent ओवरराइड करके आप इसे पूरा कर सकते हैं।

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); 
    } 
} 

फिर हमेशा की तरह FrameLayout के स्थान पर कि लेआउट का उपयोग करें:

<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"> 
    ... 

तुम भी सुपर कॉल पूरी तरह से अगर आप घटना प्राप्त करने से बच्चे के विचारों को रोकने के लिए की जरूरत को छोड़ सकता है, लेकिन मुझे लगता है कि यह होगा दुर्लभ हो।

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 समाधान:

  1. ViewGroup पर उपयोग onInterceptTouchEvent, दिखाया गया के रूप में आप कुछ बनाना, लेकिन सभी नहीं की जरूरत है, डिफ़ॉल्ट कार्यक्षमता की, वहाँ के पुनर्लेखन के लिए एक बहुत है here

  2. लेआउट ईवेंट को लेआउट को संभालने से बचें, और एक दृश्य है जो लेआउट के बच्चे के दृश्य है, जो स्पर्श घटनाओं को संभालने के लिए अपने पूरे आकार को कवर करता है।

    यह कक्षाओं को विस्तारित करने जितना कुशल नहीं है, लेकिन यह बहुत आसान है और नई फाइलें/कक्षाएं बनाने की आवश्यकता नहीं है।

    उदाहरण:

    बस देखने के लिए स्पर्श घटनाओं को जोड़ने, और यह अन्य किसी भी दृश्य के बजाय उन्हें संभाल लूंगा।

-1

इसे "ऑनइंटरसेप्ट टचवेन्ट" का उपयोग करके हासिल किया जा सकता है। कृपया इसे आजमाएं, यह

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

मैन्युअल रूप से टचवेन्ट विधि पर कॉल करना अच्छा नहीं है ... – Crisic

संबंधित मुद्दे