2011-10-16 38 views
5

當用戶輸入EditText時,我想讓某些關鍵字改變顏色。 當應用程序發現用戶輸入它並使用Html.fromHtml時,我可以在關鍵字周圍放置HTML標籤,但用戶將自己輸入真實的HTML標籤,這會弄亂它。所以我想我應該使用Spannable?用戶正在輸入時更改文字顏色?

我該如何掃描這些關鍵字的EditText?含義 - 什麼是最有效的方式?我想也許是所有關鍵字的數組 - 然後循環,看看是否找到任何匹配。任何想法如何解決這個問題?

回答

2

嗨在EditText上使用TextWatcher來查看用戶正在鍵入並使用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監聽器檢查什麼用戶輸入。

模式匹配的示例.. int flags = Pattern.CASE_INSENSITIVE; Pattern p = Pattern.compile(「\ [0-9] * \」,flags); Linkify.addLinks(myTextView, 「content://com.foo」);

+0

是啊,我看着linkify而且幾乎正是我需要的,除了我不想讓可點擊的事實鏈接。 – bwoogie

+1

使用來自java的正則表達式。 – om252345

0

在onTextChanged監聽器創建模式匹配和匹配的圖案與文字

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); 

} 

}

相關問題