Java 如何在android中刷新我的Spanable?

Java 如何在android中刷新我的Spanable?,java,android,syntax-highlighting,Java,Android,Syntax Highlighting,我希望能够刷新这个高亮显示文本的Spannable,以便每次键入列出的一个短语时,它都会高亮显示它。但我的问题是,它只能键入一次短语,我一直在试图寻找其他方法来刷新或突出显示它,然后删除它已突出显示,但我迄今为止尝试的方法都不起作用。从我的想法来看,这段代码强调了与所列短语匹配的每个单词,是通过做一些ContextChanged来实现的。但我看不出是什么 editText.addTextChangedListener(new TextWatcher() { //Registere

我希望能够刷新这个高亮显示文本的Spannable,以便每次键入列出的一个短语时,它都会高亮显示它。但我的问题是,它只能键入一次短语,我一直在试图寻找其他方法来刷新或突出显示它,然后删除它已突出显示,但我迄今为止尝试的方法都不起作用。从我的想法来看,这段代码强调了与所列短语匹配的每个单词,是通过做一些ContextChanged来实现的。但我看不出是什么

editText.addTextChangedListener(new TextWatcher() {
        //Registered functions
        final String FUNCTION = "function";
        final String ENTITY = "Entity";
        final String PLAYER = "Player";
        final String MODPE = "ModPE";
        final String ZERO = "0";
        final String ONE = "1";
        final String TWO = "2";
        final String THREE = "3";
        final String FOUR = "4";
        final String FIVE = "5";
        final String SIX = "6";
        final String SEVEN = "7";
        final String EIGHT = "8";
        final String NINE = "9";
        final String CPER = "{}";
        final String PER = "()";

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after){}
        @Override
        public void onTextChanged(CharSequence s, int start, int before, int after){

        }
        //Code for Syntax Highlighting
        @Override
        public void afterTextChanged(Editable s) {
            //Registered function (to find beginning text)
            int iFUNCTION = s.toString().indexOf(FUNCTION);
            int iENTITY = s.toString().indexOf(ENTITY);
            int iPLAYER = s.toString().indexOf(PLAYER);
            int iMODPE = s.toString().indexOf(MODPE);
            int iZERO = s.toString().indexOf(ZERO);
            int iONE = s.toString().indexOf(ONE);
            int iTWO = s.toString().indexOf(TWO);
            int iTHREE= s.toString().indexOf(THREE);
            int iFOUR = s.toString().indexOf(FOUR);
            int iFIVE = s.toString().indexOf(FIVE);
            int iSIX = s.toString().indexOf(SIX);
            int iSEVEN = s.toString().indexOf(SEVEN);
            int iEIGHT = s.toString().indexOf(EIGHT);
            int iNINE = s.toString().indexOf(NINE);
            int iCPER = s.toString().indexOf(CPER);
            int iPER = s.toString().indexOf(PER);

            if (iFUNCTION >= 0) {
                s.setSpan(new ForegroundColorSpan(Color.CYAN), iFUNCTION, iFUNCTION + FUNCTION.length(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            }
            if (iENTITY >= 0) {
                s.setSpan(new ForegroundColorSpan(Color.CYAN), iENTITY, iENTITY + ENTITY.length(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            }
            if (iPLAYER >= 0) {
                s.setSpan(new ForegroundColorSpan(Color.CYAN), iPLAYER, iPLAYER + PLAYER.length(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            }
            if (iMODPE >= 0) {
                s.setSpan(new ForegroundColorSpan(Color.CYAN), iMODPE, iMODPE + MODPE.length(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            }
            if (iZERO >= 0) {
                s.setSpan(new ForegroundColorSpan(Color.RED), iZERO, iZERO + ZERO.length(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            }
            if (iONE >= 0) {
                s.setSpan(new ForegroundColorSpan(Color.RED), iONE, iONE + ONE.length(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            }
            if (iTWO >= 0) {
                s.setSpan(new ForegroundColorSpan(Color.RED), iTWO, iTWO + TWO.length(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            }
            if (iTHREE >= 0) {
                s.setSpan(new ForegroundColorSpan(Color.RED), iTHREE, iTHREE + THREE.length(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            }
            if (iFOUR >= 0) {
                s.setSpan(new ForegroundColorSpan(Color.RED), iFOUR, iFOUR + FOUR.length(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            }
            if (iFIVE >= 0) {
                s.setSpan(new ForegroundColorSpan(Color.RED), iFIVE, iFIVE + FIVE.length(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            }
            if (iSIX >= 0) {
                s.setSpan(new ForegroundColorSpan(Color.RED), iSIX, iSIX + SIX.length(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            }
            if (iSEVEN >= 0) {
                s.setSpan(new ForegroundColorSpan(Color.RED), iSEVEN, iSEVEN + SEVEN.length(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            }
            if (iEIGHT >= 0) {
                s.setSpan(new ForegroundColorSpan(Color.RED), iEIGHT, iEIGHT + EIGHT.length(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            }
            if (iNINE >= 0) {
                s.setSpan(new ForegroundColorSpan(Color.RED), iNINE, iNINE + NINE.length(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            }
            if (iPER >= 0) {
                s.setSpan(new ForegroundColorSpan(Color.CYAN), iPER, iPER + PER.length(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            }
            if (iCPER >= 0) {
                s.setSpan(new ForegroundColorSpan(Color.CYAN), iCPER, iCPER + CPER.length(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            }
        }
    });

对于每一项检查,您都可以迭代,直到用尽相同类型的所有案例:

例如:

。。。
String String=s.toString();
int lastMatch=0;
而(lastMatch=0){
s、 setSpan(新的ForegroundColorSpan(Color.CYAN)、iffunction、iffunction+FUNCTION.length()、Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
lastMatch=iffunction+FUNCTION.length();//添加长度,因为我们已经匹配了它
}
...
在将lastMatch用于下一种类型之前,请确保将其重置为0


显然,这也将是非常低效的,因为它将为已经有跨距的区域重新创建跨距,您可以执行检查,如果已经存在跨距,则不重新创建跨距,或者只在已编辑的文本区域中创建跨距。

这会进入ContextChanged吗?这将在afterTextChanged回调中,就像你现在拥有的一样。顺便问一下,“最后一个”是什么?应该是lastMatch吗?对不起,应该是lastMatch,我已经编辑了答案。它仍然突出显示键入的第一个单词,其余为白色。
...
String string = s.toString();
int lastMatch = 0;
while(lastMatch < string.length() && (iFUNCTION = string.indexOf(FUNCTION, lastMatch)) >= 0){
    s.setSpan(new ForegroundColorSpan(Color.CYAN), iFUNCTION, iFUNCTION + FUNCTION.length(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    lastMatch = iFUNCTION + FUNCTION.length(); // add the length since we've already matched it
}
...