Android 在用户键入时更改文本颜色?

Android 在用户键入时更改文本颜色?,android,android-edittext,string-formatting,Android,Android Edittext,String Formatting,当用户键入编辑文本时,我希望某些关键字可以更改颜色。 我可以在应用程序发现用户键入并使用HTML.fromHtml时,在关键字周围放置HTML标记,但用户将自己输入真正的HTML标记,这会把事情搞砸。所以我想我应该用Spanable 我应该如何准确地扫描这些关键字的编辑文本?最有效的方法是什么?我在想可能是一个包含所有关键字的数组,然后循环查看是否找到匹配项。有什么想法吗?您好,在EditText上使用TextWatcher查看用户键入的内容,并使用Linkify检查模式。 } 使用onTex

当用户键入编辑文本时,我希望某些关键字可以更改颜色。 我可以在应用程序发现用户键入并使用HTML.fromHtml时,在关键字周围放置HTML标记,但用户将自己输入真正的HTML标记,这会把事情搞砸。所以我想我应该用Spanable


我应该如何准确地扫描这些关键字的编辑文本?最有效的方法是什么?我在想可能是一个包含所有关键字的数组,然后循环查看是否找到匹配项。有什么想法吗?

您好,在EditText上使用TextWatcher查看用户键入的内容,并使用Linkify检查模式。

}

使用onTextChanged Listener检查用户正在键入的内容

模式匹配的示例。。 int flags=Pattern.CASE_不区分大小写; Pattern p=Pattern.compile(“\[0-9]*\”,标志); Linkify.addLinks(myTextView,第,
"content://com.foo");

创建模式匹配器,并将模式与ContextChanged Listener中的文本匹配

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import android.app.Activity;
import android.graphics.Color;
import android.graphics.Typeface;
import android.os.Bundle;
import android.text.Editable;
import android.text.Spannable;
import android.text.SpannableStringBuilder;
import android.text.TextWatcher;
import android.text.style.ForegroundColorSpan;
import android.text.style.StyleSpan;
import android.util.Log;
import android.widget.EditText;

public class ColorEditText extends Activity {

private Pattern helloPattern = Pattern.compile("Hello");
private Pattern simplePattern = Pattern.compile("Simple");
private SpannableStringBuilder spannable;
private EditText edit;
private TextWatcher colorChangeText;

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

    edit =(EditText) findViewById(R.id.edit);

    colorChangeText = new TextWatcher() {

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

            edit.removeTextChangedListener(colorChangeText);    

            Log.d("Changes",edit.getText().toString());

            spannable = new SpannableStringBuilder( edit.getText().toString() );

            Matcher o = helloPattern.matcher(spannable);    


            while (o.find()) {

                spannable.setSpan(new StyleSpan(Typeface.BOLD), o.start(), o.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                spannable.setSpan(new ForegroundColorSpan(Color.rgb(103, 58,  183)), o.start(), o.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

            }

            Matcher n = simplePattern.matcher(spannable);

            while (n.find()) {
                 spannable.setSpan(new StyleSpan(Typeface.BOLD), n.start(), n.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                 spannable.setSpan(new ForegroundColorSpan(Color.rgb(0, 105,  92)), n.start(), n.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

            }

            edit.setText(spannable);
            edit.setSelection(spannable.length());

            edit.addTextChangedListener(colorChangeText);
        }



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

        }

        @Override
        public void afterTextChanged(Editable s) {


        }
    };

    edit.addTextChangedListener(colorChangeText);

}

}

是的,我看过linkify,它几乎正是我需要的,只是我不想制作可点击的链接。
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import android.app.Activity;
import android.graphics.Color;
import android.graphics.Typeface;
import android.os.Bundle;
import android.text.Editable;
import android.text.Spannable;
import android.text.SpannableStringBuilder;
import android.text.TextWatcher;
import android.text.style.ForegroundColorSpan;
import android.text.style.StyleSpan;
import android.util.Log;
import android.widget.EditText;

public class ColorEditText extends Activity {

private Pattern helloPattern = Pattern.compile("Hello");
private Pattern simplePattern = Pattern.compile("Simple");
private SpannableStringBuilder spannable;
private EditText edit;
private TextWatcher colorChangeText;

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

    edit =(EditText) findViewById(R.id.edit);

    colorChangeText = new TextWatcher() {

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

            edit.removeTextChangedListener(colorChangeText);    

            Log.d("Changes",edit.getText().toString());

            spannable = new SpannableStringBuilder( edit.getText().toString() );

            Matcher o = helloPattern.matcher(spannable);    


            while (o.find()) {

                spannable.setSpan(new StyleSpan(Typeface.BOLD), o.start(), o.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                spannable.setSpan(new ForegroundColorSpan(Color.rgb(103, 58,  183)), o.start(), o.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

            }

            Matcher n = simplePattern.matcher(spannable);

            while (n.find()) {
                 spannable.setSpan(new StyleSpan(Typeface.BOLD), n.start(), n.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                 spannable.setSpan(new ForegroundColorSpan(Color.rgb(0, 105,  92)), n.start(), n.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

            }

            edit.setText(spannable);
            edit.setSelection(spannable.length());

            edit.addTextChangedListener(colorChangeText);
        }



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

        }

        @Override
        public void afterTextChanged(Editable s) {


        }
    };

    edit.addTextChangedListener(colorChangeText);

}