是否可以在TextView中使用类似于WebView中的此功能的spannable?
Bob McDonalds <span style="white-space: nowrap"><b.mcdonalds@domain.com></span>
Run Code Online (Sandbox Code Playgroud)
我想避免
|Email: Bob McDonalds <b. |
|mcdonalds@domain.com> |
Run Code Online (Sandbox Code Playgroud)
我宁愿
|Email: Bob McDonalds |
|<b.mcdonalds@domain.com> |
Run Code Online (Sandbox Code Playgroud) 奇怪的是想知道Spannableandroid中的目的是什么.char数组不够吗?
我有一个spanned文本需要转换为Spannable. 这就是我在代码中尝试做的事情:
Spannable buffer = (Spannable) text;
这段代码给了我一个“无法将 Spannable 转换为 Spanned”。是否可以?如果是这样怎么办?谢谢!
我有一个编辑文本,它有多个彩色文本,如下面的代码。有没有办法存储文本和颜色并再次显示它们?我曾经使用 SharedPreference 来存储字符串整数等,但这不适用于 Spannables。
Spannable span1 = new SpannableString("this");
Spannable span2 = new SpannableString("is");
Spannable span3 = new SpannableString("text");
span1.setSpan(new ForegroundColorSpan(Color.parseColor("#292929")), 0, span1.length(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
span2.setSpan(new ForegroundColorSpan(Color.parseColor("#2980b9")), 0, span2.length(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
span3.setSpan(new ForegroundColorSpan(Color.parseColor("#FFFFFF")), 0, span3.length(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
edittext.setText(TextUtils.concat(span1, span2, span3));
Run Code Online (Sandbox Code Playgroud) 我需要一个文本视图显示两个文本 - 其中一个左对齐,另一个 - 右对齐。在阅读了 spans 之后,我编写了以下代码:
private Spannable generateText(PageModel page) {
final DateFormat dateFormat = android.text.format.DateFormat.getDateFormat(context);
final String pageNumber = page.getNumber() + " ";
final String string = pageNumber + dateFormat.format(new Date(page.getLastModified())) ;
Spannable spannable = Spannable.Factory.getInstance().newSpannable(string);
spannable.setSpan(new AlignmentSpan.Standard(Alignment.ALIGN_NORMAL), 0, pageNumber.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
spannable.setSpan(new AlignmentSpan.Standard(Alignment.ALIGN_OPPOSITE), pageNumber.length() + 1, string.length() - 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
return spannable;
}
Spannable spannable = generateText(page);
textView.setText(spannable);
Run Code Online (Sandbox Code Playgroud)
结果是两者都左(正常)对齐。实际上,根本没有对齐发生,即使我使用居中对齐。字符串部分的边界没有越过,为什么不起作用?你知道为什么这行不通吗?
当用户撰写时,如何在 EditText 文本上应用跨度?
例如,用户在撰写时激活了“粗体”,因此此后输入的每个字符都应该是粗体。
我考虑过向 EditText 添加文本更改侦听器并在用户撰写时更新文本,但我想知道是否有更好的方法来执行此操作。
什么是Android Span上下文中的标记对象?
android.text.SpanWatcher
Run Code Online (Sandbox Code Playgroud)
当此类型的对象附加到Spannable时,将调用其方法以通知它已添加,更改或删除其他标记对象.
这里标记对象的含义是什么?
HTML
Run Code Online (Sandbox Code Playgroud)
超文本标记语言
超文本超文本是包含指向其他文本的链接的文本.
加价?
请告诉我Markup的意思是什么......
编辑
所以标记对象是Span ...感谢pskink
我正在开发一个用户可以将内容发布到Feed的应用程序.在我的编辑文本(用于撰写)中,文本颜色为灰色.但是,当用户键入一个哈希标记,例如#help时,我需要在键入时将该文本着色为黑色,因此当用户键入"#"时,文本必须为黑色,直到它们开始一个新单词,然后文本颜色需要还原灰色
我一直在尝试使用文本观察器和spannable字符串进行着色.
这是我用textwatcher做的 onTextChanged
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
//Remove Text watcher to prevent infinite look
mTextField.removeTextChangedListener(contentFieldWatcher);
String startChar = null;
startChar = Character.toString(s.charAt(start));
L.i(getClass().getSimpleName(), "CHARACTER OF NEW WORD: " + startChar);
if (startChar.equals("#")) {
tagCheck(s.toString().substring(start), start, start + count);
}
}
Run Code Online (Sandbox Code Playgroud)
tagCheck方法
private void tagCheck(String s, int start, int end) {
mSpannable.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.black_colour)), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
Run Code Online (Sandbox Code Playgroud)
mSpannable是一个Spannable.
这种方法的问题是'#'显示为startChar,但是当用户键入下一个字符(符号或字母)时,它显示为startChar.用户键入圣诞老人的情况仍然是startChar.所以我面临的问题是如何在用户键入主题标签时动态着色文本.
所以普通字母可以正常工作,但是当你使用符号时它不会.我希望这个问题很清楚..我已经看了几天这一切都变得朦胧:)
我在一个 TextView 中使用了两种不同的字体:第一种是 SVG 字体,第二种是 TTF 字体。
要将带有文本的图标设置为 TextView,我正在使用它:
String icon =getContext().getString(iconId);//""
String text = getResources().getString(labelId);//"AnyText"
int iconLength = icon.length();
String fulltext = icon + " " + text;
SpannableStringBuilder spLabelWithIcon = new SpannableStringBuilder(fulltext);
spLabelWithIcon.setSpan(new CustomTypefaceSpan(TypefaceManager.ICONS.getTypeface()),
0, iconLength, Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
spLabelWithIcon.setSpan(new CustomTypefaceSpan(TypefaceManager.GOTHAM_BOOK.getTypeface()),
iconLength, fulltext.length(), Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
myTextView.setText(spLabelWithIcon);
Run Code Online (Sandbox Code Playgroud)
结果:图标不在行的垂直中心(或者文本不在垂直中心):
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)