7

我正在尝试使 EditText 的文本具有多种颜色。例如,如果我的文本是“It is a good day.”,是否可以将句子的“It is a”部分设为绿色而其余部分设为红色?

4

5 回答 5

7

我使用类似的东西使我的颜色的某些部分变为绿色:

final String text = "Some Text";
Spannable modifiedText = new SpannableString(text);
modifiedText.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.green)), 0, lengthYouWant, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(modifiedText);
于 2013-01-01T21:05:14.803 回答
5

你可以使用spannables

Spannable spannable = yourText.getText();
spannable .setSpan(new BackgroundColorSpan(Color.argb(a, r, g, b)), start, end, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
于 2013-01-01T21:09:49.260 回答
2

我也有这个烦恼。几个小时后,我想出了如何处理它:

  mYourTextView.addTextChangedListener(new TextWatcher() {

        private String oldContent = "";

        @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 String newContent = mYourTextView.getText().toString();

            if (newContent.length() > 10 && !oldContent.equals(newContent)) {
                oldContent = newContent;
                mYourTextView.setText(Html.fromHtml(
                        String.format("%s", "<font color='#000000'>" + newContent.substring(0, 10) + "</font>")
                                + "<font color='#ff0000'>" + newContent.substring(10, newContent.length()) + "</font>"));
                Log.d("onTextChanged", "Start : " + start);

                //move cursor after current character
                mYourTextView.setSelection(start + 1 > mYourTextView.getText().toString().length()
                        ? start : start + 1);

            }
        }

        @Override
        public void afterTextChanged(Editable s) {
        }
    });

此代码使前 10 个字符为黑色,后面的字符为红色。我们需要变量 oldContent 来防止循环无穷大,因为当 EditText 调用 setText() 然后 onTextChanged

于 2016-11-02T08:44:20.553 回答
1

是的。您将需要创建一个Spannable对象(aSpannedStringSpannedStringBuilder),然后在其上设置跨度以应用您寻找的颜色。

例如,此示例项目中的以下方法获取 a 的内容TextView,搜索用户输入的字符串,并用紫色背景颜色标记所有出现的位置,删除所有先前的标记:

  private void searchFor(String text) {
    TextView prose=(TextView)findViewById(R.id.prose);
    Spannable raw=new SpannableString(prose.getText());
    BackgroundColorSpan[] spans=raw.getSpans(0,
                                             raw.length(),
                                             BackgroundColorSpan.class);

    for (BackgroundColorSpan span : spans) {
      raw.removeSpan(span);
    }

    int index=TextUtils.indexOf(raw, text);

    while (index >= 0) {
      raw.setSpan(new BackgroundColorSpan(0xFF8B008B), index, index
          + text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
      index=TextUtils.indexOf(raw, text, index + text.length());
    }

    prose.setText(raw);
  }

在您的情况下,更改前景色将使用 aForegroundColorSpan而不是 a BackgroundColorSpan

事情变得有点棘手EditText,因为用户可以编辑文本,你需要选择你的标志来满足你想要的规则。例如,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE会说:

  • 在跨区中间输入的字符获得跨区的效果(例如,前景色)
  • 在跨越区域之前或之后输入的字符被认为在跨越区域之外,因此不会获得跨越区域的效果
于 2013-01-01T21:05:17.993 回答
0

只是为了详细说明 WarrenFaith 的答案:

实现一个 TextWatcher

yourEditText.onFocusChangeListener = this

override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {}
override fun afterTextChanged(s: Editable?) {
    val newTextStyle: Spannable = SpannableString(s?.toString())
    resources.getColor(R.color.color_w3w, requireActivity().theme)
    val span = ForegroundColorSpan(resources.getColor(R.color.your_color_here, requireActivity().theme))
    newTextStyle.setSpan(span, 0, 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)//Will set the first three characters to 'R.color.your_color_here'
    s?.set(0, 3, span)
}
于 2021-12-02T12:45:39.723 回答