如何在addtextchangedlistener中使用可扩展字符串来更改edittext子字符串的颜色?

ffx8fchx  于 2021-07-06  发布在  Java
关注(0)|答案(3)|浏览(316)

我正在尝试实现一些类似于代码编辑器的东西,其中关键字会自动高亮显示。我将有一个字符串数组,当用户键入文本并匹配字符串数组中的字符串时,我想更改edittext字符串的颜色和字体。我正在使用addtextchangelistener,但是整个edittext的文本发生了变化。我只想突出显示匹配的单词。我知道我必须使用可扩展字符串,但代码崩溃了。有人能帮我正确使用addtextchangedlistener()的可启用字符串吗?这是我的密码:

editText.addTextChangedListener(new TextWatcher() {
            private SpannableString spanString;
            private ForegroundColorSpan span;
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            }
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                spanString = new SpannableString(s);
                span = new ForegroundColorSpan(Color.YELLOW);
                spanString.setSpan(span, start, start + count, 0);
            }
            @Override
            public void afterTextChanged(Editable s) {
                int beginIdx = spanString.getSpanStart(s);
                int endIdx = spanString.getSpanEnd(s);

                if(s.subSequence(beginIdx, endIdx).equals("for"))
                {
                        editText.setText(spanString, EditText.BufferType.SPANNABLE);
                }
                spanString.removeSpan(span);
                span = null;
                spanString = null;
            }
        });
ijxebb2r

ijxebb2r1#

试试这个,询问任何问题。您可以更改任何文本的颜色,只需将“for”替换为所需的文本并替换颜色-

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) {
            }

            @Override
            public void afterTextChanged(Editable s) {
                String string = s.toString();

                if (string.contains("for")) {
                    //Count to change color of all the "for"
        int count = (string.length() - string.replaceAll("for", "").length())/3;

                    //You can make these global
                    int start = 0;
                    int beginIdx = 0;
                    int endIdx = 0;
                    for (int i = 0; i < count; i++) {
                        beginIdx = string.indexOf("for", start);
                        endIdx = beginIdx + 3;
                        start = endIdx;
                        if (beginIdx > 0)
                            s.setSpan(new ForegroundColorSpan(Color.GREEN),//ContextCompat.getColor(getContext(), R.color.indigo)
                                    beginIdx, endIdx, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

                    }

                }
            }
        });
sigwle7e

sigwle7e2#

通过呼叫 editText.setTextColor(getResources().getColor(R.color.indigo)); 您正在设置整个文本的颜色。
您必须设置关键字范围的颜色(在本例中为“for”关键字)。为此,您必须知道关键字在字符串中的位置(关键字的起始索引和结束索引)。然后可以这样设置。

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) {
        }
        @Override
        public void afterTextChanged(Editable s) {
            if (s.toString().contains("for"))
            {
                Spannable wordToSpan = new SpannableString("for");
                wordToSpan.setSpan(new ForegroundColorSpan(ContextCompat.getColor(getContext(), R.color.indigo), START_INDEX_OF_THE_KEYWORD_IN_THE_STRING, END_INDEX_OF_THE_KEYWORD_IN_THE_STRING, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                editText.setText(wordToSpan);
            }
        }
    });

因为设置一个span需要调用一个settext,所以还要注意,您需要防止无限循环。。。

s1ag04yj

s1ag04yj3#

我知道你在尝试创建ide。要突出显示代码的语法,您应该使用spannable string或使用任何库来简化它。此外,您可以尝试以下代码:

I created simple code for highlight syntax in EditText. First i created a HashMap to store keywords and colors.

                    Map<String,Integer> map = new HashMap<>();
                    map.put("public",Color.CYAN);
                    map.put("void", Color.BLUE);
                    map.put("String",Color.RED);

然后我为edittext添加了一个textwatcher。在aftertextchanged方法中,我使用以下代码为每个关键字设置颜色,

........
                    @Override
                    public void afterTextChanged(Editable editable) {
                        String string = editable.toString();
                        String[] split = string.split("\\s");
                        for(int i = 0 ; i < split.length ; i++){
                            String s = split[i];
                            if(map.containsKey(s)){
                                int index = string.indexOf(s);
                                int color = map.get(s);
                                editable.setSpan(new ForegroundColorSpan(color),
                                        index,
                                        index + s.length(),
                                        Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
                            }

                        }
                    }

相关问题