2012-02-14 7 views
8

मेरे पास TextViewClickableSpan है जिसमें दोनों layout_height और layout_width wrap_content है।ClickableSpan अजीब व्यवहार: खाली स्थान पर क्लिक करते समय ऑनक्लिक() पर कॉल किया गया

जब TextView में टेक्स्ट बहुत लंबा नहीं है, तो यह ठीक काम करता है। जब टेक्स्ट काफी लंबा होता है तो यह 2 लाइन लेता है, यह भी ठीक काम करता है लेकिन कुछ अजीब व्यवहार करता है।

वह तब होता है जब मैंने दूसरी पंक्ति के रिक्त स्थान पर क्लिक किया (पाठ के साथ अभी तक भरें लेकिन TextView का हिस्सा), ClickableSpanonClick() कॉलबैक कहा जाता है।

मुझे इसकी उम्मीद नहीं है क्योंकि मैंने रिक्त स्थान पर क्लिक किया है, लेकिन स्पैन किए गए टेक्स्ट पर नहीं। हालांकि यह अधिक प्रभावित नहीं करता है, मैं जानना चाहता हूं कि पीछे क्या है।

TextView tv = (TextView) findViewById(R.id.text); 
tv.setText("TEXT TEXT TEXT TEXT"); 
SpannableStringBuilder ssb = new SpannableStringBuilder(); 
ssb.append(tv.getText()); 
ssb.setSpan(new TestClickableSpan(), ssb.length()-5, ssb.length(), 0); 
tv.setText(ssb); 
tv.setMovementMethod(LinkMovementMethod.getInstance()); 
tv.setOnTouchListener(new TextViewOnTouchListener()); 

TextViewOnTouchListener:

class TextViewOnTouchListener implements OnTouchListener{ 

     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      Log.d("TextView", "onTouch"); 
      return false; 
     }  
} 

TestClickableSpan:

class TestClickableSpan extends ClickableSpan{ 

     @Override 
     public void onClick(View arg0) { 
      Log.d("ClickableSpan", "Confirm OnClick: "+arg0.toString()); 
     }  
    } 
+0

क्या आपने इसे हल किया? –

+0

@ किरणकुमार – dor506

उत्तर

9

मैं LinkMovementMethod का विस्तार करके इसे हल करने में कामयाब रहे, और चेक

मैं नीचे दिए गए कोड के साथ ClickableSpan सेट चाहे टच इवेंट फीट टेक्स्ट लेंस से बराबर या बड़ा है:

public class MovementMethod extends LinkMovementMethod { 

    @Override 
    public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) { 
     int action = event.getAction(); 

     if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_DOWN) { 
      int x = (int) event.getX(); 
      int y = (int) event.getY(); 

      x -= widget.getTotalPaddingLeft(); 
      y -= widget.getTotalPaddingTop(); 

      x += widget.getScrollX(); 
      y += widget.getScrollY(); 

      Layout layout = widget.getLayout(); 
      int line = layout.getLineForVertical(y); 
      int off = layout.getOffsetForHorizontal(line, x); 

      if (off >= widget.getText().length()) { 
       // Return true so click won't be triggered in the leftover empty space 
       return true; 
      } 
     } 

     return super.onTouchEvent(widget, buffer, event); 
    } 
} 
+3

से नीचे मेरा जवाब देखें यह शानदार है, धन्यवाद! इसके लिए बाहर निकलने की एक बात यह है कि आपको स्थिर getInstance() फ़ंक्शन को ओवरराइड करने की आवश्यकता होगी, अन्यथा आपको अंतर्निहित LinkMovementMethod का एक उदाहरण वापस कर दिया जाएगा। मैं कुछ समय खोने की कोशिश कर रहा था कि उम्मीद है कि मैं किसी और को कुछ सिरदर्द बचाऊंगा। – martinp

+2

@ dor506 मैं तुमसे प्यार करता हूँ! बहुत बहुत धन्यवाद। – Dogcat

+0

@ मार्टिनप धन्यवाद आदमी, मैंने वहां भी समय खो दिया। LinkMovementMethod के ऑन टचवेन्ट को बुलाया जा रहा था और मुझे उलझन में डाल दिया गया था। – Mallika

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