java - 如何为Android中edittext中写入的每个字符设置不同的颜色?

标签 java android android-edittext

我正在尝试将 edittext 编写的字符用不同的颜色着色。 例如,我希望在用 edittext 编写时始终将“a”设为红色,而其他部分则保持黑色。至少有可能吗?

我在edittext中找到了一些关于颜色设置的答案,如下所示,但这都是关于通过开始索引和结束索引范围进行颜色设置。

** 示例 **

final String text = "for example";
Spannable modifiedText = new SpannableString(text);
modifiedText.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.red)), 0, 2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(modifiedText);

最佳答案

是的,这是可能的,但我不知道在性能方面是否太昂贵。 您可以使用 TextWatcher 在字符颜色映射上为最后插入的字符着色。

public class MainActivity extends AppCompatActivity {
    private SpannableStringBuilder mSpannableStringBuilder;
    private EditText mEditText;
    private static final Map<String, Integer> COLORS_MAP = new HashMap<>();

    @Override protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // here you can populate your map with colors
        COLORS_MAP.put("a", Color.RED);
        COLORS_MAP.put("b", Color.GREEN);
        COLORS_MAP.put("c", Color.BLUE);
        COLORS_MAP.put("d", Color.MAGENTA);

        mSpannableStringBuilder = new SpannableStringBuilder();

        mEditText = (EditText) findViewById(R.id.editText);
        mEditText.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) {

            }

            @Override
            public void afterTextChanged(Editable s) {

                if (s.length() > 0) {

                    // unregister and register the listener to avoid infinite loop
                    mEditText.removeTextChangedListener(this);

                    int start = s.length() - 1;
                    String lastChar = s.toString().substring(start);

                    SpannableString lastSpannableChar = new SpannableString(lastChar);

                    // pick the color based on the last char
                    int color = pickColorByChar(lastChar);

                    // Span to set char color
                    ForegroundColorSpan fcs = new ForegroundColorSpan(color);

                    // Set the text color for the last character
                    lastSpannableChar.setSpan(fcs, 0, 1, Spannable.SPAN_INCLUSIVE_INCLUSIVE);

                    // append the last char to the string builder so you can keep the previous span
                    mSpannableStringBuilder.append(lastSpannableChar);

                    mEditText.setText(mSpannableStringBuilder);
                    mEditText.setSelection(mEditText.getText().length()); //this is to move the cursor position

                    mEditText.addTextChangedListener(this);

                }
            }
        });
    }

    public int pickColorByChar(String aChar){
        return COLORS_MAP.get(aChar);
    }
}

这就是结果

enter image description here

关于java - 如何为Android中edittext中写入的每个字符设置不同的颜色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38639325/

相关文章:

java - 有意启动前置摄像头

android - DaggerMock 库 - 它如何覆盖模块?

android - onOptionsItemSelected android 中的警报对话框

java - Mybatis If 语句使用 include 属性

使用 Jersey Rest Web 服务时出现 java.lang.AbstractMethodError

android - 如何使 EditText 像 Twitter Android 应用程序中那样工作以进行状态更新

Android:如何制作 AutoCompleteTextView SingleLine?

android - Material Design 中的大纲编辑文本

java - 在 Java 中初始化和使用接口(interface)?

Java 客户端 SSL 套接字 unknown_ca