2011-11-07 8 views
1

ありがとうございました。私はで入力された異なる文字に異なる色を持っている私のAndroidアプリケーションでのEditTextを持つようにしようとしていますAndroid:EditTextのさまざまな文字の色が異なります

。例えばのために

アルファベット「A」は常に青色でなければならず、アルファベット「b」は常に緑色でなければなりません。

これまでのところ、私は解決策を見つけることができませんでした。 私は正しい方向に私を導くのに十分親切にしてください。

答えて

7

指摘したように、入力したテキストにSpannablesを適用することができます。このような何か:

colorEdit.addTextChangedListener(new TextWatcher() { 

    String lastText = null; 

    @Override 
    public void onTextChanged(CharSequence s, int start, int before, 
      int count) { 
     Log.d("", "lastText='" + lastText + "'"); 
     Log.d("", "s='" + s + "'"); 
     if (!s.toString().equals(lastText)) { 
      lastText = s.toString(); 

      String res = ""; 
      char[] split = s.toString().toCharArray(); 
      for (char c : split) { 
       String color = null; 
       if (c == 'a') { 
        color = "red"; 
       } else if (c == 'b') { 
        color = "green"; 
       } else if (c == 'c') { 
        color = "blue"; 
       } 
       // etc... 
       if (color != null) { 
        res += "<font color=\"" + color + "\">" + c 
          + "</font>"; 
       } else { 
        res += c; 
       } 
      } 
      int selectStart = colorEdit.getSelectionStart(); 
      int selectEnd = colorEdit.getSelectionEnd(); 
      colorEdit.setText(Html.fromHtml(res)); 
      colorEdit.setSelection(selectStart, selectEnd); 
     } 
    } 
    @Override 
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {} 

    @Override 
    public void afterTextChanged(Editable s) {} 
}); 

注意すべきいくつかの事は、私はもちろん再び実行するonTextChangedを起こしsetText呼び出すので、私はテキストが実際に変更されたことを確認してください。また、カーソルの位置が正しく保存されていないため、保存して復元することもできます。

0

ベストショットはおそらくEditTextを上書きし、自分でdraw()を書きます。しかし、この方法は、通常は組み込みのビュー・クラスをオーバーライドするので、狂気になります。

+0

私はあなたの言うことは、私の唯一の選択肢かもしれないと思うし始めていました。しかし、私はEditTextウィジェットのダミーイメージにonClickリスナーを追加し、入力テキストを使用して文字を自己設計の文字イメージに置き換えることも考えていました。これを一貫して考えたことはありませんが、私はそれが最後の手段/あなたの解決策(正しい方法ですが、はい、狂気)として仕事をするかもしれないと思います。 – Heartache

2

おそらく、それぞれの文字をそれ自身のForegroundColorSpanでラップしたいと思うでしょう。 TextWatcherを追加し、テキストが編集されるときにSpannablesを適用します。

0

私があなただったら、InputFilterを使ってください。 setText()textWatcher{} onTextChange()にはいくつかの問題があります(たとえば、ソフトキーボードでは国別の手紙を選択できません)。

Some issue with the TextWatcher

Documentation

関連する問題