2011-10-16 13 views
5

Mientras el usuario está escribiendo en EditText, me gustaría que ciertas palabras clave cambien de color. Podría colocar etiquetas HTML alrededor de las palabras clave cuando la aplicación descubra que el usuario lo escribió y usar Html.fromHtml, pero el usuario ingresará etiquetas HTML reales y eso lo arruinaría. ¿Entonces supongo que debería usar Spannable?¿Cambiar color de texto a medida que el usuario escribe?

¿Y cómo exactamente debo escanear el texto de EditText para estas palabras clave? Significado - ¿Cuál es la forma más eficiente? Estaba pensando en una selección de todas las palabras clave, y luego revisé para ver si se encuentran coincidencias. ¿Alguna idea sobre cómo abordar esto?

Respuesta

2

Hola Use TextWatcher en EditText para ver qué usuario está escribiendo y use Linkify para verificar el patrón. 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 

      } 

}

Uso OnTextChanged Listener para comprobar lo que el usuario está escribiendo.

Ejemplo de coincidencia de patrón ... int flags = Pattern.CASE_INSENSITIVE; Patrón p = Pattern.compile ("\ [0-9] * \", flags); Linkify.addLinks (myTextView, p, "content: //com.foo");

+0

Sí, me miraron Linkify y es casi exactamente lo que necesito excepto por el hecho de que no quiero hacer se puede hacer clic campo de golf. – bwoogie

+1

Usa Regex de Java. – om252345

0

Crear un comparador de patrón y el patrón de coincidencia con el texto en 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); 

} 

}

Cuestiones relacionadas