使用带有 EditText 的 SpannableString 更改子字符串颜色
Using SpannableString with an EditText to change substring color
我正在尝试在 Android Studio 中制作代码编辑器。
当我需要更改单个关键字(如 if
、while
、int
等)的颜色时,我有点卡住了。
到目前为止,我已经尝试使用 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。
我正在尝试在 Android Studio 中制作代码编辑器。
当我需要更改单个关键字(如 if
、while
、int
等)的颜色时,我有点卡住了。
到目前为止,我已经尝试使用 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。