2011-10-16 18 views
5

Podczas gdy użytkownik pisze w EditText, chciałbym, aby określone słowa kluczowe zmieniały kolory. Mogłabym umieścić znaczniki HTML wokół słów kluczowych, gdy aplikacja odkryje, że użytkownik wpisał je i używa Html.fromHtml, ale użytkownik sam będzie wprowadzał prawdziwe znaczniki HTML, które mogłyby zepsuć to. Sądzę, że powinienem użyć Spannable?Zmieniasz kolor tekstu podczas pisania?

A jak dokładnie powinienem skanować EditText dla tych słów kluczowych? Znaczenie - jaki jest najbardziej efektywny sposób? Myślałem o zestawie wszystkich słów kluczowych, a następnie przejrzałem i sprawdziłem, czy znaleziono jakieś dopasowania. Wszelkie pomysły, jak się do tego podejść?

Odpowiedz

2

Witam Użyj TextWatcher w EditText, aby zobaczyć, co pisze użytkownik i użyj Linkify, aby sprawdzić wzór. 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 

      } 

}

Zastosowanie onTextChanged Listener, by sprawdzić, co użytkownik pisze.

Próbka do dopasowania wzorca .. int flags = Pattern.CASE_INSENSITIVE; Wzór p = Pattern.compile ("\ [0-9] * \", flagi); Linkify.addLinks (myTextView, p, "treść: //com.foo");

+0

Tak spojrzałem na linkify i jest prawie dokładnie to, co muszę z wyjątkiem faktu, że nie chcesz zrobić klikalne spinki do mankietów. – bwoogie

+1

Użyj Regex z języka Java. – om252345

0

Tworzenie Matcher wzór i dopasować wzór z tekstem w 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); 

} 

}