我在中定义了以下字符串string.xml
<string name="photo_heading"><xliff:g name="name">%s</xliff:g> shared a <xliff:g name="permission">%s</xliff:g><xliff:g name="photo">%s</xliff:g> with you.</string>
Run Code Online (Sandbox Code Playgroud)
String 接受 3 个字符串参数:name, permission,photo
我有两种设置不同风格的方法。
public Spannable getStyledItalic(String text) {
Spannable sb = new SpannableString(text);
sb.setSpan(new StyleSpan(Typeface.ITALIC), 0, text.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
return sb;
}
Run Code Online (Sandbox Code Playgroud)
和
public Spannable getStyledName(String name) {
Spannable sb = new SpannableString(name);
sb.setSpan(new AbsoluteSizeSpan(LPConstants.FONT_SIZE_NAME), 0, name.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
sb.setSpan(new StyleSpan(Typeface.BOLD), 0, name.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
sb.setSpan(new ForegroundColorSpan(mContext.getResources().getColor(R.color.app_primary)), 0, name.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
return sb;
}
Run Code Online (Sandbox Code Playgroud)
现在我将这些样式应用于不同的参数并返回字符串,但这不起作用。这是我正在做的事情:
public String getHeading(Printrequest printRequest) {
String name = printRequest.sentbyname;
String …Run Code Online (Sandbox Code Playgroud) 我没想到这是一个问题,但我不能简单地在编辑文本中的单词下划线,因为软键盘的自动建议功能中的下划线会自动为选定的单词加下划线。但是,我仍然想在应用下划线时保留该功能。
在编辑文本中:
默认情况下,选定的单词会自动添加下划线,然后当单击空格时,下划线将被删除,因此当我通过按钮应用下划线范围然后点击空格时,它会被删除。
应用下划线:-
SpannableString word = new SpannableString(noteview.getText());
word.setSpan((new UnderlineSpan()), 0, word.length(), 0);
edittext.setText(word);
Run Code Online (Sandbox Code Playgroud)
如果未选择该单词,此代码可以正常工作,因此我尝试在跨越之前更改选择,但仍然没有解决。是否有解决方法可以删除自动建议下划线?
android autosuggest android-softkeyboard android-edittext spannablestring
Button btnBold = (Button) findViewById(R.id.btnBold);
btnBold.setOnClickListener(new OnClickListener() {
@Override
public void onClick (View v){
startSelection = etx.getSelectionStart();
endSelection = etx.getSelectionEnd();
Spannable s = etx.getText();
s.setSpan(new StyleSpan(Typeface.BOLD), startSelection, endSelection, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
}
});
Button btnNormal = (Button) findViewById(R.id.btnNormal);
btnNormal.setOnClickListener(new OnClickListener() {
@Override
public void onClick (View v){
startSelection = etx.getSelectionStart();
endSelection = etx.getSelectionEnd();
Spannable s = etx.getText();
s.setSpan(new StyleSpan(Typeface.NORMAL), startSelection, endSelection, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
}
});
Run Code Online (Sandbox Code Playgroud)
使用上面的代码,我尝试对按钮中选定的文本进行加粗和取消加粗。
例如: 我通过一次选择所有内容将这一行加粗。
现在,如果我通过选择上行中的一些文本来应用取消粗体,那么它将不起作用。
我已经浏览过这些答案,但没有运气:
如何取消 Android Edittext 中选定文本的粗体?
上述解决方案的问题在于,例如,如果您从文本中选择了五个单词并将它们设置为粗体,现在您选择了该粗体文本的某些部分并取消粗体,那么所有五个单词都将取消粗体。
上述链接中提到的解决方案使用以下代码来删除跨度,这不能正确解决问题
Spannable str = …Run Code Online (Sandbox Code Playgroud) 所以,....
我有这个代码(onStart):
ss = new SpannableString(getString(R.string.legal_user_acceptance_disclaimer));
ss.setSpan(clickableSpanTermsOfUse, 32, 44, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
Run Code Online (Sandbox Code Playgroud)
它泄漏了父级- Activity(这些行在里面)。
如果我只改变数字:
ss.setSpan(clickableSpanTermsOfUse, 49, 63, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
Run Code Online (Sandbox Code Playgroud)
泄漏消失。
clickableSpanTermsOfUse (memory leak is the same with a normal ClickableSpan):
clickableSpanTermsOfUse = new NoRefCopySpan() {
@Override
public void onClick(View textView) {
startActivity(new Intent(ChooseLoginRegistrationActivity.this, PrivacyStatement.class));//, TermsOfUse.class));
}
@Override
public void updateDrawState(TextPaint ds) {
super.updateDrawState(ds);
ds.setUnderlineText(false);
}
};
public class NoRefCopySpan extends ClickableSpan implements NoCopySpan {
@Override
public void onClick(@NonNull View widget) { }
@Override
public void updateDrawState(TextPaint ds) …Run Code Online (Sandbox Code Playgroud) final StyleSpan bss = new StyleSpan(android.graphics.Typeface.BOLD);
final SpannableString ss = new SpannableString("How to " + text + " in " + type);
ss.setSpan(bss, 7, text.length() + 7, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
ss.setSpan(bss, 7 + text.length() + 4, ss.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
textView.setText(ss);
Run Code Online (Sandbox Code Playgroud)
我想做text和type 大胆.但只有类型是BOLD.
我错过了什么?
我有一个很长的文本,我想打破多个页面.我还需要一种方式来设置这个文本的样式.
我正在开发一个应用程序,其中选定的联系人添加到EditText一个关闭标记图像,当我点击该关闭标记图像时,应删除该联系人.我已完成代码显示关闭标记图像,但我不知道如何处理那些关闭标记图像.请建议我如何.

我的代码:
for (int i = 0; i < selectedItems.size(); i++) {
String na = selectedItems.get(i);
TextView tv = createContactTextView(na);
BitmapDrawable bd = (BitmapDrawable) convertViewToDrawable(tv);
bd.setBounds(0, 0, bd.getIntrinsicWidth(),
bd.getIntrinsicHeight());
sb.append(na + ",");
sb.setSpan(new ImageSpan(bd), sb.length()
- (na.length() + 1), sb.length() - 1,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
txt.setText(sb);
private Object convertViewToDrawable(TextView view) {
int spec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
view.measure(spec, spec);
view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
Bitmap b = Bitmap.createBitmap(view.getMeasuredWidth(),
view.getMeasuredHeight(), Bitmap.Config.ARGB_8888);
Canvas c = …Run Code Online (Sandbox Code Playgroud) 我想用计时器多次改变文本部分的颜色.
最简单的方法是:
SpannableStringBuilder ssb = new SpannableStringBuilder(mainText);
ForegroundColorSpan span = new ForegroundColorSpan(Color.BLUE);
ssb.setSpan(span, start, end, 0);
tv.setText(ssb);
Run Code Online (Sandbox Code Playgroud)
但是如果我在一秒钟内多次运行上面的代码,我实际上TextView每次都会更改整个(大)文本,因此特别是在低端设备上会发生不需要的内存CPU负载.
我怎样才能Span打开一个TextView并且只改变Span开始和结束位置?
它会起作用还是全文替换将在幕后发生?
我的文字是固定的,永远不会改变.
当我将AppTheme设置为Theme.AppCompat.Light.DarkActionBar时,我无法使SpannableString工作.
我有一个按钮,其文本设置为SpannableString.当我使用Holo主题时,文本按预期呈现,但是当我切换到AppCompat主题时,span效果会被忽略.如何使用AppCompat主题使SpannableString工作?

styles.xml - 当在这两个主题之间切换时,我得到了非常不同的结果......
<resources>
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar" />
<!--<style name="AppTheme" parent="@android:style/Theme.Holo.Light" />-->
</resources>
Run Code Online (Sandbox Code Playgroud)
...对于使用SpannableString的按钮
public static class PlaceholderFragment extends Fragment {
public PlaceholderFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main, container, false);
Button button = (Button) rootView.findViewById(R.id.button);
String detail = "ABC";
String caption = String.format("2 %s", detail);
Spannable span = new SpannableString(caption);
int detailIndex = caption.indexOf(detail);
span.setSpan(new StyleSpan(Typeface.BOLD), 0, detailIndex, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
span.setSpan(new RelativeSizeSpan(0.5f), detailIndex, detailIndex+detail.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
button.setText(span);
return rootView; …Run Code Online (Sandbox Code Playgroud) 我试图从我的样式中删除样式SpannableString但不幸的是不起作用,我的目标是在单击文本时删除样式。
SpannableString content = new SpannableString("Test Text");
content.setSpan(new StyleSpan(Typeface.BOLD_ITALIC), 0, content.length(), 0);
...
Run Code Online (Sandbox Code Playgroud)
点击操作:
content.removeSpan(new StyleSpan(Typeface.BOLD_ITALIC)) // not working
Run Code Online (Sandbox Code Playgroud) android ×10
spannablestring ×10
spannable ×2
autosuggest ×1
drawable ×1
memory ×1
memory-leaks ×1
page-break ×1
spanned ×1
string ×1
styledtext ×1
text ×1
textview ×1
xml ×1