2011-08-25 14 views
5

समस्या का वर्णन:एंड्रॉयड :: OnTouchListener && OnClickListener संयोजन मुद्दा

मैं एक RelativeLayout पर एक TextView है और मैं यह लाल रंग जब उपयोगकर्ता इसे छू लेती है, और जब वह इस पर क्लिक करता अन्य पृष्ठ पर जाना चाहते हैं। इसलिए मैंने क्लिक करने के लिए OnClickListener सेट करने का प्रयास किया, और OnTouchListener स्पर्श फ़ंक्शन को लागू करने के लिए (MotionEvent.ACTION_DOWN) लेकिन यह संयोजन काम नहीं करता है, क्योंकि OnTouchListenerOnClickListener गैर-कार्यात्मक (पता नहीं क्यों) बनाता है।

मंचों पर लोगों का कहना है कि हम OnTouch MotionEvent.ACTION_UP द्वारा OnClick लागू कर सकते हैं, लेकिन यह एक मेरी TextView लेआउट से बाहर शुरू किया जा सकता (TextView वाला क्लिक किया जा अगर आप इसे दबाते हैं और उसे से बाहर जारी करने के लिए अपनी अंगुली को खींचें) और यह वांछित व्यवहार नहीं है क्योंकि मैं चाहता हूं:
क्लिक करें = टेक्स्ट व्यू पर प्रेस + रिलीज़ करें।

क्या कोई मुझे इसके लिए समाधान दे सकता है?

उत्तर

3

एडेल, पहले क्लिक के साथ समस्या है, या आपको कोई क्लिक नहीं मिलता है?

यदि आपके पास एकाधिक क्लिक करने योग्य लेआउट हैं तो आपको यह समस्या है कि आपको पहले के लिए कोई क्लिक ईवेंट नहीं मिलता है। ऐसा इसलिए है क्योंकि यह इसे पहले चुना गया है और फिर आपको क्लिक ईवेंट मिलता है, नीचे दिए गए कोड को आज़माएं।

private class CustomTouchListener implements OnTouchListener { 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     TextView tv = (TextView) v.findViewById(R.id.single_line_text); 
     if (event.getAction() == MotionEvent.ACTION_DOWN) { 
      tv.setTextColor(COLOR_WHEN_PRESSED); 
     } else if (event.getAction() == MotionEvent.ACTION_UP) { 
      tv.setTextColor(COLOR_WHEN_RELEASED); 
      // Action of click goes here 
     } else if (event.getAction() == MotionEvent.ACTION_CANCEL) { 
      tv.setTextColor(COLOR_WHEN_RELEASED); 
          // To handle release outside the layout region 
     } 
     return false; 
    } 
} 

यदि आप अपने लेआउट के लिए टच श्रोता सेट करते हैं तो यह मेरे वर्तमान कार्यान्वयन में काम कर रहा है।

आप भी अपने लेआउट पर नीचे स्थापित करने के लिए

android:focusable="true" 
android:focusableInTouchMode="true" 
android:clickable="true" 

आशा है कि यह मदद करता है की जरूरत है !!!

संपादित करें: इसके अतिरिक्त, डाउन और यूपी दोनों में एक ध्वज होना चाहिए। इसे नीचे सेट करें और जांचें कि यूपी में इसका सेट है या नहीं। यह एक बग से बच जाएगा जहां उपयोगकर्ता स्क्रीन में कहीं भी टैप कर सकता है और फिर अपने टेक्स्टव्यू पर होवर कर सकता है और उसे छोड़ सकता है।

+0

बहुत धन्यवाद! आपने निश्चित रूप से मेरी मदद की। मेरे लिए चाल तीन गुणों को सेट करना था ... – harsimranb

+0

मदद के लिए धन्यवाद! मैं एंड्रॉइड गायब था: मेरे टेक्स्ट व्यू – Gatekeeper

21

आप view.performClick() को action_up पर कॉल कर सकते हैं। आशा करता हूँ की ये काम करेगा।

your_txtView.setOnClickListener(new TextView.OnClickListener(){ 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 

     } 
    }); 

    your_txtView.setOnTouchListener(new TextView.OnTouchListener(){ 
      @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     if (MotionEvent.ACTION_DOWN == event.getAction()) { 

     } else if (MotionEvent.ACTION_UP == event.getAction()) { 
      v.performClick(); 
     } 

     return true; 
    } 
    }); 
+0

में फोकस करने योग्य = "सच" मुझे एक ही समस्या थी ... और v.perform सुंदर काम पर क्लिक करें ... यह समाधान है ... कृपया उत्तर –

+0

+1 स्वीकार करें, यही वह है मुझे इसकी तलाश थी। – tokudu

+0

धन्यवाद स्वेन। यह कमाल का है। – aNoviceGuy

2

एक ही समस्या थी। ACTION_MOVE से झूठी वापसी करके इसे हल करें। मैं कुछ घंटों तक इसके साथ लड़ रहा हूं, विभिन्न चीजों की कोशिश कर रहा हूं, लेकिन ऐसा लगता है जैसे मैंने इस छोटी सी समस्या को नजरअंदाज कर रखा है ... और अब यह समझ में आता है। जब आप ऑन टच से सच लौटते हैं, तो फ़्यूचर प्रोसेसिंग रोक दी जाती है, ताकि ऑनक्लिक लिस्टनर किसी भी आंदोलन और ट्रिगर्स के बारे में अवगत न हो, पॉइंटर दृश्य के बाहर जाने के बाद भी क्लिक करें।

+0

@ bugs99 की तरफ से जो प्रतिष्ठा की कमी के कारण टिप्पणी नहीं जोड़ सकता: 'वापसी सत्य 'को' वापसी झूठी 'में बदलकर, आप' onTouchListener() 'कार्रवाई कर सकते हैं और फिर स्पर्श ईवेंट को पास कर सकते हैं 'onClickListener()'।इसके साथ, 'performClick()' को स्पष्ट रूप से निष्पादित करने की आवश्यकता नहीं है – gturri

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