我希望在我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的字符串,那么字符串的长度可能会有所不同,这意味着错误的字符集可能是可点击的.我该怎么做?
我发现的只是两种次优方法。它仍然使用 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)
就像我说的,这确实是一种“最不糟糕”的情况,但我想我至少会把它扔在那里,因为我不认为有任何其他方法可以通过本地化来做到这一点,因为编译器已经不知道字符串是如何翻译的。
| 归档时间: |
|
| 查看次数: |
304 次 |
| 最近记录: |