2016-02-08 13 views
5

ユーザーがコンテンツをフィードに投稿できるアプリケーションで作業しています。私の編集テキスト(作成に使用)では、テキストの色はグレーです。しかし、ユーザがハッシュタグをタイプすると、 #help入力時に黒色にする必要があるので、ユーザーが '#'をタイプすると、新しい単語が始まるまでテキストが黒く塗りつぶされなければなりません。テキストの色はグレーに戻す必要があります。ユーザーがハッシュタグを入力するときにテキストの色を変更します

私はテキストウォッチャーと色分け可能な文字列を使用しています。ここで

は私がtextwatcher onTextChanged

 @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 


      //Remove Text watcher to prevent infinite look 
      mTextField.removeTextChangedListener(contentFieldWatcher); 
      String startChar = null; 
       startChar = Character.toString(s.charAt(start)); 
       L.i(getClass().getSimpleName(), "CHARACTER OF NEW WORD: " + startChar); 


    if (startChar.equals("#")) { 
        tagCheck(s.toString().substring(start), start, start + count); 
       } 
      } 

tagCheck方法

private void tagCheck(String s, int start, int end) { 
     mSpannable.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.black_colour)), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
    } 

mSpannableがSpannableあるとやっていることです。

このメソッドの問題は、 '#'はstartCharとして表示されますが、ユーザーがシンボルまたは文字の次の文字を入力すると、startCharとして表示されます。ユーザーがsantaをタイプしたかのように、 's'はstartCharのままです。だから私は、ユーザーがハッシュタグをタイプするときにテキストを動的に色付けする方法に直面しています。

普通の文字は正しく動作しますが、シンボルを使用すると正しく動作しません。私は質問が明快であることを願っています。私は数日の間これを見ていました。それはすべて曇っています:)

答えて

3

私はコード

Spannable mspanable; 
int hashTagIsComing = 0; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 



    final EditText edt = (EditText) findViewById(R.id.editText1); 

    mspanable = edt.getText(); 

    edt.addTextChangedListener(new TextWatcher() { 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 

      String startChar = null; 

      try{ 
       startChar = Character.toString(s.charAt(start)); 
       Log.i(getClass().getSimpleName(), "CHARACTER OF NEW WORD: " + startChar); 
      } 
      catch(Exception ex){ 
       startChar = " "; 
      } 

       if (startChar.equals("#")) { 
        tagCheck(s.toString().substring(start), start, start + count); 
        hashTagIsComing++; 
       } 

       if(startChar.equals(" ")){ 
        hashTagIsComing = 0; 
       } 

       if(hashTagIsComing != 0) { 
        tagCheck(s.toString().substring(start), start, start + count); 
        hashTagIsComing++; 
       } 
     } 

     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, 
       int after) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void afterTextChanged(Editable s) { 
      // TODO Auto-generated method stub 

     } 
    }); 



} 


private void tagCheck(String s, int start, int end) { 
    mspanable.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.color)), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
} 
+0

あなたが最もinapropriate文字からハッシュタグを明確にお知らせ –

+0

場合は、自動での問題が存在することをお勧めです、次を使用できsoloution

を試してみましたが、見つかりましたユーザーが自動提案をクリックすると、色付けが失われます –

1

私はあなたが記述している振る舞いを達成することができました。別のTextView。以下のスクリーンショットとコードを参照してください。

private void colorText(String s) { 
    if (!TextUtils.isEmpty(s)) { 
     Spannable spannable = new SpannableString(s); 
     int position = 0; 
     position = s.indexOf("#", position); 
     while (position != -1) { 
      colorSpannable(spannable, position, s.indexOf(" ", position + 1) != -1 ? s.indexOf(" ", position + 1) : s.length()); 
      position = s.indexOf("#", position + 1); 
     } 
     textView.setText(spannable); 
    } 
    editText.addTextChangedListener(textWatcher); 
} 

colorSpannableは、単にインデックス開始から色を追加します:最初のスペースまで「#」の文字と色のテキストを検索する

@Override 
public void afterTextChanged(Editable s) { 
    editText.removeTextChangedListener(textWatcher); 
    colorText(s.toString()); 
} 

方法:私は、これは、リスナーのafterTextChangedで

を役に立てば幸いインデックス終了まで

private void colorSpannable(Spannable s, int start, int end){ 
    s.setSpan(new ForegroundColorSpan(Color.BLUE), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 
} 

enter image description here

関連する問題