2017-01-18 8 views
5

मैं अपने TextView एक क्लिक करने योग्य Url, मैं जानता हूँ कि मैं SpannableString उपयोग कर सकते हैं इसएंड्रॉइड स्टूडियो स्थानीयकरण संसाधनों से एक क्लिक करने योग्य यूआरएल से स्ट्रिंग (टेक्स्टव्यू में) का एक हिस्सा बनाते हैं?

SpannableString mySpannableString = new SpannableString("a string"); 
ClickableSpan myClickableSpan = new ClickableSpan() { 
    @Override 
    public void onClick(View textView) { 
     // do something 
    } 
    @Override 
    public void updateDrawState(TextPaint ds) { 
      super.updateDrawState(ds); 
      ds.setUnderlineText(false); 
     } 
}; 
mySpannableString.setSpan(myClickableSpan, 2, 6, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 

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

+1

अपनी आवश्यकता को परिभाषित करने के लिए जहां आपको इसे क्लिक करने योग्य या कहां से अपेक्षित भाग क्लिक करने योग्य है –

+0

[यह] (http://stackoverflow.com/questions/10696986/how-to-set-the- भाग-का-पाठ-दृश्य-क्लिक-क्लिक करने योग्य) आपके लिए समान प्रश्न है। – FiN

+0

@ एफआईएन इसी तरह, हाँ, लेकिन यह मेरे से भिन्न होता है क्योंकि मेरे काल की अनुक्रमणिका अलग-अलग होती है, जहां उस मामले में यह नहीं होता है –

उत्तर

2

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

सबसे पहले, आपके द्वारा उल्लेख की जाने वाली विधि है, और आप भाषाओं के विशाल स्विच स्टेटमेंट के माध्यम से जा सकते हैं और प्रत्येक के लिए अवधि को हल कर सकते हैं। यह निश्चित रूप से भयानक है, लेकिन सही स्पैन क्लिक करने योग्य सुनिश्चित करने का यह सबसे सटीक तरीका है।

उदा।

if (Locale.getDefault().getLanguage().contentEquals("en") { 
    // spannable gets substring a,b 
else if (Locale.getDefault().getLanguage().contentEquals("fr") { 
    // spannable gets substring x,y 
} 

फिर से, अच्छा नहीं।

अब, अपने अनुवादकों स्ट्रिंग सबस्ट्रिंग में टूट, IE संभाल कर सकते हैं, तो

<string name=suba>Some intro text to</string> 
<string name=sublinka>linkable A</string> 
<string name=subb>and then some intro text to</string> 
<string name=sublinka>linkable B</string> 

तो आप प्रोग्राम की तरह Spannable तार का निर्माण कर सकते हैं:

TextView textView = (TextView) findViewById(R.id.text_view); 

String subA = getString(R.string.suba); 
String subLinkA = getString(R.string.sublinka); 
String subB = getString(R.string.subb); 
String subLinkB = getString(R.string.sublinkb); 

SpannableStringBuilder spannableText = new 
SpannableStringBuilder(subA); 

    spannableText.append(subLinkA); 
    spannableText.setSpan(new ClickableSpan() { 
     @Override 
     public void onClick(View widget) { 
      Toast.makeText(this, "Sub Link A Clicked", Toast.LENGTH_SHORT).show(); 
     } 
    }, spannableText.length() - subLinkA.length(), spannableText.length(), 0); 

    spannableText.append(subB); 

    spannableText.append(subLinkB); 
    spannableText.setSpan(new ClickableSpan() { 
     @Override 
     public void onClick(View widget) { 
      Toast.makeText(this, "Sub Link B Clicked", Toast.LENGTH_SHORT).show(); 
     } 
    }, spannableText.length() - subLinkB.length(), spannableText.length(), 0); 

    textView.setMovementMethod(LinkMovementMethod.getInstance()); 
    textView.setText(spannableText, TextView.BufferType.SPANNABLE); 

जैसा कि मैंने कहा, यह सच है एक "कम से कम बदतर" स्थिति, लेकिन मैंने सोचा कि मैं इसे कम से कम बाहर निकाल दूंगा, क्योंकि मुझे नहीं लगता कि स्थानीयकरण के साथ ऐसा करने के अन्य तरीके हैं, क्योंकि कंपाइलर को का कोई ज्ञान नहीं है स्ट्रिंग का अनुवाद किया जाता है।

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