2012-10-26 11 views
26

नहीं बुलाया जा रहा है onTouchEvent मैं एक समस्या यह है कि मेरी विधिविधि

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

नए कहा जाता है हो रही है। कोई विचार क्यों ऐसा है? मैं एक Google के एपीआई 4.0.3 एप्लिकेशन का निर्माण कर रहा हूं, और मैं अपने दृश्यफ्लिपर के लिए स्वाइप सक्षम करने के लिए ट्रजिंग कर रहा हूं। हालांकि अगर स्पर्श पर नया कॉल किया जाता है तो यह काम नहीं कर सकता है।

btw

:

public class MainActivity extends SherlockMapActivity implements ActionBar.TabListener { 

मेरी गतिविधि की घोषणा Thats। और स्वाइप का पता लगाने के लिए मैंने इसे लागू किया है:

SimpleOnGestureListener simpleOnGestureListener = new SimpleOnGestureListener(){ 

    @Override 
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) { 

     float sensitvity = 50; 
     if((e1.getX() - e2.getX()) > sensitvity){ 
      SwipeLeft(); 
     }else if((e2.getX() - e1.getX()) > sensitvity){ 
      SwipeRight(); 
     } 

     return true; 
    } 

}; 
GestureDetector gestureDetector= new GestureDetector(simpleOnGestureListener); 

धन्यवाद!

संपादित करें:

main.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/main_view" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:orientation="horizontal" > 

<ViewFlipper 
    android:id="@+id/ViewFlipper" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:background="#ffffff" > 

    <include 
     android:layout_height="match_parent" 
     layout="@layout/mymain" /> 

    <include layout="@layout/secondmain" /> 
    <include layout="@layout/thirdmain" /> 
    <include layout="@layout/fourthmain" /> 
</ViewFlipper> 
</LinearLayout> 

EDIT2: मेरी शामिल लेआउट के सभी कार्यान्वित scrollview यह संभव स्क्रॉल लेता है कि घटनाओं और उन्हें संभाल कि है। और यदि इशारा पता लगाने के लिए कैसे?

+0

ठीक है, अब मुझे यकीन है कि समस्या यह है कि स्क्रॉलव्यू हैंडल स्पर्श करता है, तो फिर भी इसे अनदेखा करने के लिए और फिर भी स्क्रॉलिंग उपलब्ध है? – gabrjan

उत्तर

40

मैं एक आदर्श पाया करने के लिए सेट की requestDisallowInterceptTouchEvent की आवश्यकता है उपाय। मैंने नई विधि लागू की:

@Override 
public boolean dispatchTouchEvent(MotionEvent event) { 

    View v = getCurrentFocus(); 
    boolean ret = super.dispatchTouchEvent(event); 

और अब यह सब ठीक काम करता है!

संपादित करें:

मेरे अंतिम कोड:

@Override 
public boolean dispatchTouchEvent(MotionEvent event) { 
    View v = getCurrentFocus(); 
    if (v instanceof EditText) { 
     View w = getCurrentFocus(); 
     int scrcoords[] = new int[2]; 
     w.getLocationOnScreen(scrcoords); 
     float x = event.getRawX() + w.getLeft() - scrcoords[0]; 
     float y = event.getRawY() + w.getTop() - scrcoords[1]; 
     if (event.getAction() == MotionEvent.ACTION_UP 
       && (x < w.getLeft() || x >= w.getRight() || y < w.getTop() || y > w 
         .getBottom())) { 

      InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
      imm.hideSoftInputFromWindow(getWindow().getCurrentFocus() 
        .getWindowToken(), 0); 
     } 
    } 
    boolean ret = super.dispatchTouchEvent(event); 
    return ret; 
} 
+0

धन्यवाद, यह @Chaosit द्वारा एक से अधिक आसान समाधान है। –

+0

हाय - आपने इस नई विधि को कहां लागू किया? और यह वापस क्या करता है? – Jona

+0

संपादित उत्तर की जांच करें। मेरे पास यह कार्य मेरी MainActivity.java फ़ाइल में लागू किया गया है। या ऐप के मुख्य वर्ग में कहना बेहतर है। – gabrjan

1

सभी इशारे और स्पर्श घटनाएं पदानुक्रम को देखने में सबसे कम तत्व पर जाती हैं जो इसे संभाल सकती है। इसलिए यदि आपके पास शामिल लेआउट में कोई श्रोता है तो आप ((TypeOfParrent)yourView.getParent()).onTouchEvent(event) पर कॉल करने वाले हैंडलर को ईवेंट का प्रतिनिधि देने के लिए कॉल कर सकते हैं।

जोड़ें: मैं आपको ViewPager का उपयोग फ़्लिपिंग दृश्यों के लिए उपयोग करने के लिए पुनः संयोजित करता हूं। व्यूपेजर में आपको अपने स्वयं के जेस्चर लिस्टनर को लागू करने की आवश्यकता नहीं है।

http://www.edumobile.org/android/android-beginner-tutorials/view-pager-example-in-android-development/

http://developer.android.com/reference/android/support/v4/view/ViewPager.html

5

ठीक है, अब मैं यह सुनिश्चित करें कि समस्या यह है कि scrollview संभाल छूता है, तो वैसे भी है कि उपेक्षा और अभी तक स्क्रॉल तो उपलब्ध होने के लिए कर रहा हूँ?

हाँ यह समस्या है, जब एंड्रॉइड हैंडल टच घटनाओं को संभालने के लिए प्रत्येक घटना बच्चे से माता-पिता तक जाती है, तो पहले इसे व्यूफ्लिपर द्वारा संभाला जाता है, लेकिन फिर यह स्क्रॉलव्यू पर जाता है। इसलिए आपको GetParent() अनुरोध को कार्यान्वित करना होगा (अनुरोध) DisallowInterceptTouchEvent (true) (ViewParent class देखें) ताकि ViewFlipper द्वारा प्रबंधित सभी स्पर्श ईवेंट को चालू किया जा सके, और फिर क्षैतिज तब दिशा को पहचानें यदि क्षैतिज तब फ्लिप दृश्य न हो तो स्कॉलव्यू को स्पर्श करें या बस scrollview स्क्रॉल प्रोग्राम के रूप में

संपादित करें: इसके अलावा आप अपने ViewFlipper GestureDetector.onTouchEvent (घटना) में और इस श्रोता ट्रिगर में OnTouchListener लागू कर सकते हैं, लेकिन यह भी अपने माता-पिता को देखने सच

5

जैसा कि मैंने Gabrjan पद की टिप्पणी में लिखा है कि इस लगातार आग, जबकि स्क्रीन को छूने, वहाँ वास्तव में एक आसान तरीका घटनाओं नीचे केवल स्पर्श पाने के लिए है:

@Override 
public boolean dispatchTouchEvent(MotionEvent event) { 
    if (event.getAction() == MotionEvent.ACTION_DOWN) { 
     System.out.println("TOUCH DOWN!"); 
     //set immersive mode here, or whatever... 
    } 
    return super.dispatchTouchEvent(event); 
} 

यह जब भी स्क्रीन के किसी भी भाग चाहे कोई भी तत्व छुआ था इमर्सिव मोड में एंड्रॉयड डाल करने के लिए मेरे लिए बहुत उपयोगी था। लेकिन मैं बार-बार इमर्सिव मोड सेट नहीं करना चाहता था!

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