Изменить цвет текста, когда пользователь печатает? - PullRequest
5 голосов
/ 16 октября 2011

Пока пользователь печатает в EditText, я бы хотел, чтобы определенные ключевые слова меняли цвета.Я мог бы разместить HTML-теги вокруг ключевых слов, когда приложение обнаружит, что пользователь набрал его, и использовать Html.fromHtml, но пользователь сам будет вводить реальные HTML-теги, и это может испортить его.Так что я думаю, что я должен использовать Spannable?

И как именно я должен сканировать EditText для этих ключевых слов?Смысл - какой самый эффективный способ?Я думал, может быть, массив всех ключевых слов - а затем перебрать и посмотреть, найдены ли какие-либо совпадения.Есть идеи как подойти к этому?

Ответы [ 2 ]

2 голосов
/ 16 октября 2011

Привет. Используйте TextWatcher на EditText, чтобы увидеть, что пользователь печатает, и используйте Linkify, чтобы проверить шаблон. https://developer.android.com/reference/android/text/util/Linkify.html

EditText.addTextChangedListener(new TextWatcher() {

            @Override
            public void onTextChanged(CharSequence s, int arg1, int arg2, int arg3) {
                // TODO Auto-generated method stub

            }

}

Используйте onTextChanged Listener, чтобы проверить, что пользователь печатает.

Образец для сопоставления с образцом. int flags = Pattern.CASE_INSENSITIVE; Pattern p = Pattern.compile ("\ [0-9] * \", flags); Linkify.addLinks (myTextView, p, "Содержание: //com.foo");

0 голосов
/ 08 сентября 2014

Создание сопоставления с образцом и сопоставление рисунка с текстом в onTextChanged 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);

}

}

...