如何在不更改整个文本视图颜色的情况下更改文本颜色
Posted
技术标签:
【中文标题】如何在不更改整个文本视图颜色的情况下更改文本颜色【英文标题】:how to change text color without changing the the whole textview color 【发布时间】:2019-04-20 05:26:54 【问题描述】:我试图通过简单地单击按钮来更改文本颜色,但是当我单击按钮时,它也会更改先前键入的文本颜色。意味着改变整个文本的颜色。当我尝试通过 Spannable 更改颜色时,它会更改所选文本部分的颜色,但不会更改我接下来要输入的文本。有没有一种方法可以单击按钮,它不会更改整个文本颜色,而是更改我接下来键入的颜色。谢谢
这是我只知道的
redtxt.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View view)
str.setSpan(new ForegroundColorSpan(Color.parseColor(txtColor)), selStart, selEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
text.setTextColor(Color.parseColor("#d32f2f"));
);
【问题讨论】:
你能解释更多关于你的要求,并分享你的整个代码,比如str
和txtColor
是什么
可扩展 str = text.getText(); int selStart = text.getSelectionStart(); int selEnd = text.getSelectionEnd(); ForegroundColorSpan[] styleSpans = text.getText().getSpans(selStart, selEnd, ForegroundColorSpan.class); txtColor 是字符串,它是按钮点击颜色的返回值。
什么是str
在这里你能解释一下吗
str 是 Spannable 名称。
@SShah ,您需要实现 Spannable String builder 和 onChangeText 只需 append spanned string 到 Spannable String builder。
【参考方案1】:
把你的整个文本变成Spannable喜欢
Spannable text = edittext.getText();
然后就做吧。
if (edittext.getText().length() != 0)
text.setSpan(new ForegroundColorSpan(YOUR_COLOR), selection_start, selection_end, 34);
【讨论】:
它部分有效,但是当我直接转到下一行然后将文本颜色设置为默认值时它不起作用。而且当我在其他跨度文本附近单击时,它不会从中获取颜色。 然后你需要编码到Edittext的TextWatcher()中。在每个 onTextChanged() 应用上面的行。 --->>>>> public void onTextChanged(CharSequence s1, final int start, final int before, final int count) text.setSpan(new ForegroundColorSpan(color), start, start+1, 34); 现在完美运行。谢谢。还有一件事如何获得相邻文本的颜色?假设我之前输入的是蓝色,现在我输入的是红色,但是当我想在蓝色文本中添加一些内容时,它会从中获取蓝色并开始在该区域输入蓝色?【参考方案2】:例如,您可以使用SpannableString
:
final SpannableString text = new SpannableString("Hello ***");
text.setSpan(new RelativeSizeSpan(1.5f), text.length() - "***".length(), text.length(),
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
text.setSpan(new ForegroundColorSpan(Color.RED), 3, text.length() - 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
tv.setText(text);
【讨论】:
我不明白这部分 text.setSpan(new RelativeSizeSpan(1.5f), text.length() - "***".length(), text.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 或查看此链接中的一些示例:medium.com/@programmerr47/…【参考方案3】:您需要实现 Spannable String builder(Global Object) 和 onChangeText 事件,只需将 spannable String 附加到 Spannable String builder。
SpannableStringBuilder objSpannableStringBuilder;
edt.addTextChangedListener(new TextWatcher()
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after)
@Override
public void onTextChanged(CharSequence s, int start, int before, int count)
final SpannableString text = new SpannableString(s.toString());
text.setSpan(new ForegroundColorSpan(Color.RED), 3, text.length() - 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); objSpannableStringBuilder.append(text);
your_edit_text.setText(objSpannableStringBuilder);
@Override
public void afterTextChanged(Editable s)
);
【讨论】:
代码中的“your_edit_text(Spannable String) comere”是什么意思? @SShah 这意味着您的文本更改了字符串(变量 CahrSequense s)。我刚刚编辑了答案。立即查看以上是关于如何在不更改整个文本视图颜色的情况下更改文本颜色的主要内容,如果未能解决你的问题,请参考以下文章
在不更改边框颜色的情况下更改 GridView 单元格中的文本颜色
VIM:如何在不使用非文本颜色元素的情况下更改 Showbreak Highlight 颜色
如何在不选择 RichTextBox 的情况下恢复插入符号位置或更改文本颜色