2012-08-05 16 views
9

जैसा दिखने के लिए प्रारूप टेक्स्ट व्यू मैं android:autoLink का उपयोग फ़ॉर्मेटिंग लिंक के लिए ठीक है और ऐसे में, लेकिन मुझे का उपयोग करने की आवश्यकता है, इसलिए मैं इस मामले में इसका उपयोग नहीं कर सकता। तर्क यह है कि मुझे गलती से फोन नंबर पर क्लिक करना बहुत आसान लगता है, इसलिए मैं Dialog की पुष्टि के साथ क्लिक को अवरुद्ध करने जा रहा हूं और फिर कॉल करूँगा।लिंक

क्या मेरे TextView में अभी भी फ़ोन नंबर बनाने का एक आसान तरीका है एक सामान्य क्लिक करने योग्य लिंक की तरह दिखता है? मैंने एंड्रॉइड सोर्स कोड के चारों ओर पोक किया, लेकिन संदर्भ के लिए मेरे लिए कोई विशेष शैली नहीं मिली।

+0

एक समाधान ClickableSpan विस्तार करने के लिए लिंक पर क्लिक के अपने स्वयं के कस्टम हैंडलिंग करने के लिए किया जाएगा: http://developer.android.com/reference/android/text/style/ClickableSpan.html यह थ्रेड भी जांचें: http://stackoverflow.com/questions/11413399/open-textview-links-at-another-activity-not- डिफ़ॉल्ट ब्राउज़र – almalkawi

उत्तर

3
  • आप रंग.एक्सएमएल संसाधन फ़ाइल बना सकते हैं, इसमें रंग क्या हैं। कृपया Colors
  • पर एक नज़र डालें आप अपने पाठ रेखांकित करने के लिए चाहते हैं, तो इस पोस्ट पर एक नज़र डालें करें: Underline
  • उन्हें क्लिक करने योग्य बनाने के लिए android:clickable="true" या setClickable(true) करने के लिए अपने TextViews जोड़ने के लिए मत भूलना!

    final TextView text = (TextView) findViewById(R.id.text); 
    
    SpannableString string = new SpannableString("This is the uderlined text."); 
    string.setSpan(new UnderlineSpan(), 0, string.length(), 0); 
    text.setText(string); 
    

    यह काम करना चाहिए:

3

अपने TextView के पाठ को रेखांकित करने के लिए, आप की तरह कुछ करना है। मुझे अपनी प्रगति के बारे में बताएं।

+0

केवल स्ट्रिंग के साथ सामग्री को प्रतिस्थापित करें और फिर केवल आपका कोड ठीक काम करेगा। क्योंकि सामग्री यहां कुछ भी नहीं है। –

+0

@RobiKumarTomar, धन्यवाद! आप बिल्कुल सही कह रहे है। – yugidroid

3

लिंकिफ़ एक महान वर्ग है, यह जटिल पैटर्न जैसे यूआरएल, फोन नंबर इत्यादि के लिए शिकार करता है और उन्हें URLSpans में बदल देता है। मौजूदा नियमित अभिव्यक्तियों को दोबारा लिखने के बजाय मैंने URLSpan क्लास को बढ़ाया और केवल को अपग्रेड करने के लिए एक विधि बनाई, एक टेलीफोन URL के लिए एक कस्टम URLSpans एक पुष्टिकरण संवाद के साथ।

पहले मेरी बढ़ाया URLSpan वर्ग, ConfirmSpan:

class ConfirmSpan extends URLSpan { 
    AlertDialog dialog; 
    View mView; 

    public ConfirmSpan(URLSpan span) { 
     super(span.getURL()); 
    } 

    @Override 
    public void onClick(View widget) { 
     mView = widget; 

     if(dialog == null) { 
      AlertDialog.Builder mBuilder = new AlertDialog.Builder(widget.getContext()); 
      mBuilder.setMessage("Do you want to call: " + getURL().substring(4) + "?"); 
      mBuilder.setNegativeButton("No", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 
        dialog.cancel(); 
       } 
      }) 
      .setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 
        openURL(); 
       } 
      }); 
      dialog = mBuilder.create(); 
     } 
     dialog.show(); 
    } 

    public void openURL() { 
     super.onClick(mView); 
    } 
} 

अगला अलग अवधि कक्षाएं बाहर स्वैप करने के लिए विधि:

private void swapSpans(TextView textView) { 
    Spannable spannable = (Spannable) textView.getText(); 
    URLSpan[] spans = textView.getUrls(); 
    for(URLSpan span : spans) { 
     if(span.getURL().toString().startsWith("tel:")) { 
      spannable.setSpan(new ConfirmSpan(span), spannable.getSpanStart(span), spannable.getSpanEnd(span), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
      spannable.removeSpan(span); 
     } 
    } 
} 

अंत में तुम सब करने की जरूरत है ऑटोलिंक विशेषता के साथ एक टेक्स्ट व्यू बनाएं:

android:autoLink="phone" 

और swapSpans() विधि को कॉल करना याद रखें। समझें कि मैंने इसे मजेदार के लिए लिखा है, ऐसा करने के अन्य तरीके भी हो सकते हैं लेकिन मैं इस समय उनसे अनजान हूं। उम्मीद है की यह मदद करेगा!

+0

धन्यवाद, यह बहुत अच्छा लग रहा है! मैं जल्द ही इसे लागू करने की कोशिश करूंगा और देख सकता हूं कि यह कैसा चल रहा है। :) –

8

यह कम से कम समाधान है:

final CharSequence text = tv.getText(); 
final SpannableString spannableString = new SpannableString(text); 
spannableString.setSpan(new URLSpan(""), 0, spannableString.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
tv.setText(spannableString, TextView.BufferType.SPANNABLE); 

दुख की बात है, क्लिक के प्रभाव कोई वास्तविक यूआरएल लिंक पर क्लिक किया जा रहा है के रूप में दिखाई नहीं है, लेकिन यदि आप ऐसा है जैसे कि यह दूर कर सकते हैं:

final CharSequence text = tv.getText(); 
    final SpannableString notClickedString = new SpannableString(text); 
    notClickedString.setSpan(new URLSpan(""), 0, notClickedString.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
    tv.setText(notClickedString, TextView.BufferType.SPANNABLE); 
    final SpannableString clickedString = new SpannableString(notClickedString); 
    clickedString.setSpan(new BackgroundColorSpan(Color.GRAY), 0, notClickedString.length(), 
      Spanned.SPAN_INCLUSIVE_EXCLUSIVE); 
    tv.setOnTouchListener(new OnTouchListener() { 
     @Override 
     public boolean onTouch(final View v, final MotionEvent event) { 
      switch (event.getAction()) { 
      case MotionEvent.ACTION_DOWN: 
       tv.setText(clickedString); 
       break; 
      case MotionEvent.ACTION_UP: 
       tv.setText(notClickedString, TextView.BufferType.SPANNABLE); 
       v.performClick(); 
       break; 
      case MotionEvent.ACTION_CANCEL: 
       tv.setText(notClickedString, TextView.BufferType.SPANNABLE); 
       break; 
      } 
      return true; 
     } 
    }); 

एक और समाधान Html.fromHtml (...) का उपयोग करना है, जहां पाठ के अंदर लिंक टैग ("") हैं।

यदि आप किसी अन्य समाधान की इच्छा रखते हैं, तो this post देखें।

0

एक बेहतर उत्तर है। यही वह है जो मैंने किया था।

 final SpannableString ss = new SpannableString("Click here to verify Benificiary"); 
     ClickableSpan clickableSpan = new ClickableSpan() { 
      @Override 
      public void onClick(View textView) { 

      } 
      @Override 
      public void updateDrawState(TextPaint ds) { 
       super.updateDrawState(ds); 
       ds.setUnderlineText(false); 
      } 
     }; 
     ss.setSpan(clickableSpan,0,ss.length(),Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
textView.setMovementMethod(LinkMovementMethod.getInstance()); 
     textView.setHighlightColor(Color.BLUE); 

आप कहीं भी जाने के आप की तरह जब ClickableSpan की onclick विधि के माध्यम से दिए गए लिंक पर उपयोगकर्ता क्लिक