Android工作室从本地化资源中创建一个字符串(在Textview中)的一部分可点击的网址?

Sim*_*son 7 android

我希望在我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);
Run Code Online (Sandbox Code Playgroud)

但是如果我使用本地化资源中的字符串作为我SpannableString的字符串,那么字符串的长度可能会有所不同,这意味着错误的字符集可能是可点击的.我该怎么做?

Wes*_*inn 4

我发现的只是两种次优方法。它仍然使用 Spannable,但请听我说完,因为我正处于您所说的确切情况。

首先,有你提到的方法,你可以通过一个巨大的语言 switch 语句并解决每种语言的跨度。当然,这很可怕,但这是确保正确的跨度可点击的最准确方法。

例如

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

再说一次,不好。

现在,如果您的翻译人员可以处理分解为子字符串的字符串,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>
Run Code Online (Sandbox Code Playgroud)

然后您可以以编程方式构建 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);
Run Code Online (Sandbox Code Playgroud)

就像我说的,这确实是一种“最不糟糕”的情况,但我想我至少会把它扔在那里,因为我不认为有任何其他方法可以通过本地化来做到这一点,因为编译器已经不知道字符串是如何翻译的。