2011-10-16 10 views
5

ユーザーがEditTextを入力しているうちに、特定のキーワードで色を変更したいとします。 私は、アプリケーションがユーザーがそれをタイプしてHtml.fromHtmlを使用することを発見したときにキーワードの周りにHTMLタグを置くことができましたが、ユーザーは実際のHTMLタグを自分自身で入力してしまい、だから私はSpannableを使うべきだと思いますか?ユーザーが入力中にテキストの色を変更しますか?

これらのキーワードに対してEditTextをどのくらい正確にスキャンする必要がありますか?意味 - 最も効率的な方法は何ですか?私はおそらくすべてのキーワードの配列を考えていた - そして、ループして一致が見つかるかどうかを確認する。どのようにこれにアプローチする上の任意のアイデア?

答えて

2

こんにちは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リスナーが入力されているものユーザーを確認します。

パターンマッチングのサンプル.. int flags = Pattern.CASE_INSENSITIVE; パターンp = Pattern.compile( "\ [0-9] * \"、フラグ); Linkify.addLinks(myTextView、p、 "content://com.foo");

+0

うん、私はlinkifyを見て、それは私がクリック可能にしたいいけないという事実を除いて必要なほぼ正確に何でありますリンク。 – bwoogie

+1

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

} 

}

関連する問題