使用带有 EditText 的 SpannableString 更改子字符串颜色

Using SpannableString with an EditText to change substring color

我正在尝试在 Android Studio 中制作代码编辑器。 当我需要更改单个关键字(如 ifwhileint 等)的颜色时,我有点卡住了。

到目前为止,我已经尝试使用 SpannableString,但它似乎不适用于 EditText。该应用程序运行正常,但只要我输入 if,它就会冻结,我必须重新启动。没有 logcat 例外。

这是我的代码:

    EditText editText = findViewById(R.id.iftext);

    Keywords keys = new Keywords();

    editText.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) {
            if(editText.getText().toString().contains(keys.iff())){

                String r = editText.getText().toString();
                int index = r.indexOf(editText.getText().toString().indexOf(keys.iff()));

                SpannableString spannableString = new SpannableString(r);
                spannableString.setSpan(new ForegroundColorSpan(Color.RED), index , index, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

                editText.setText(spannableString);
            }

        }

        @Override
        public void afterTextChanged(Editable s) {

        }

keys.iff() 仅方法 returns 字符串“if”

我不确定索引,所以我尝试使用“0”和“1”常量,但它仍然冻结。

您已将 TextWatcher 添加到 editText。因此,每当您为 editText 键入或设置字符时,它都会在 onTextChanged.

中通知

第一次,您输入 if 关键字,然后代码流进入内部如果条件。

editText.setText(spannableString); 这一行将再次导致 textWatcher 在 onTextChanged 中通知。并创建无限循环。所以你的应用程序挂起或 ANR。