2011-10-16 3 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; 패턴 p = Pattern.compile ("\ [0-9] * \", 플래그); Linkify.addLinks (myTextView, p, "content : //com.foo");

+0

그래 나는 linkify 쳐다 보면서 거의 정확히 내가 클릭을 만들고 싶어 그나마 사실을 제외하고는 필요하다 모래밭. – bwoogie

+1

자바의 Regex를 사용하십시오. – 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); 

} 

은}

관련 문제