2016-07-28 4 views
1

私は、edittextで書かれたメイク文字を別の色で着色しようとしています。 たとえば、「a」はedittextで書かれているときは常に赤で、他の人は黒で表示されます。少なくともそれは可能ですか?Androidでedittextで書かれた文字ごとに異なる色を設定する方法は?

edittextで色設定に関するいくつかの回答がありましたが、開始インデックスと終了インデックスの範囲で色設定が行われています。

**例**

final String text = "for example"; 
Spannable modifiedText = new SpannableString(text); 
modifiedText.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.red)), 0, 2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
textView.setText(modifiedText); 
+0

はい、それはあなたがのためにインデックスを取得するメソッドを使用する必要があるインデックスを取得するために、TextViewの内側に着色するためspannableを使用するための良い方法があります「」 – Chol

+0

ありがとうございました。しかし、私が探しているのは、特定の文字に依存して色を取得する方法で、 'a'が入力されると赤に変わるということです。たとえば、次の例では、インデックスを超えて赤色で3文字しか表示されません。 ex)「私はリンゴを持っています。 – lifeBalkan

+0

コード書式 – fantaghirocco

答えて

0

一つの方法は、Html.fromHtml(String)を使用して、事前に定義された色にMapを使用して、そのを通じてフォントの色を設定することです。例えば

private static final String FONT_REPLACEMENT = "<font color='%1$s'>%2$s</font>"; 
private static final String DEFAULT_COLOR = "#FAFAFA"; 

public Spanned convertToHtml(String text, Map<String, String> colorSets){ 
    String altered = "<![CDATA["; 

    for(int i = 0; i < text.length(); i++) { 
     String value = String.valueOf(text.charAt(i)); 
     String color = colorSets.get(value.toLowerCase(Locale.US)); 

     if(color == null) 
      color = DEFAULT_COLOR; 

     altered += String.format(FONT_REPLACEMENT, color, value); 
    } 

    return Html.fromHtml(altered + "]]>"); 
} 

そして、あなたのような何かを行うことができ、それを使用するには:

Map<String, String> colors = new HashMap<String, String(); 
colors.put("a", "#FF0000"); 
colors.put("b", "#00FF00"); 
colors.put("c", "#0000FF"); 
.... 

textView.setText(convertToHtml("for example", colors)); 
+0

ありがとうございますが、動作しません。私はそれらをrecyclerviewで変更して欲しい。したがって、上記のbindView保留メソッドのコードが追加されました。 ** public void onBindViewHolder(最後のSimpleViewHolderのviewHolder、最終的なint位置)です。Map colors = new HashMap (); colors.put( "*"、 "#ffffff"); viewHolder.pwInput.setText(convertToHtml(myDatasetCopy.get(position).getPwInput()、colors)); ......) – lifeBalkan

+0

と同じクラス(アダプタ内)の 'convertToHtml'メソッドを持っていました。 **プライベート静的最終文字列FONT_REPLACEMENT = "%2 $ s"; プライベート静的最終文字列DEFAULT_COLOR = "#000000"; パブリックスパンconvertToHtml(String text、Map colorSets){ } – lifeBalkan

+0

文字列の変更= "<![CDATA ["; for(int i = 0; i "); **私がここにいるのは、私のメインのUIで ' lifeBalkan

1

はい、それは可能ですが、パフォーマンスの面で非常に高価である場合、私は知りません。 TextWatcherを使用して、char-colorのマップ上に最後に挿入されたcharを色付けできます。

public class MainActivity extends AppCompatActivity { 
    private SpannableStringBuilder mSpannableStringBuilder; 
    private EditText mEditText; 
    private static final Map<String, Integer> COLORS_MAP = new HashMap<>(); 

    @Override protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     // here you can populate your map with colors 
     COLORS_MAP.put("a", Color.RED); 
     COLORS_MAP.put("b", Color.GREEN); 
     COLORS_MAP.put("c", Color.BLUE); 
     COLORS_MAP.put("d", Color.MAGENTA); 

     mSpannableStringBuilder = new SpannableStringBuilder(); 

     mEditText = (EditText) findViewById(R.id.editText); 
     mEditText.addTextChangedListener(new TextWatcher() { 
      @Override 
      public void beforeTextChanged(CharSequence s, int start, int count, int after) { 

      } 

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

      } 

      @Override 
      public void afterTextChanged(Editable s) { 

       if (s.length() > 0) { 

        // unregister and register the listener to avoid infinite loop 
        mEditText.removeTextChangedListener(this); 

        int start = s.length() - 1; 
        String lastChar = s.toString().substring(start); 

        SpannableString lastSpannableChar = new SpannableString(lastChar); 

        // pick the color based on the last char 
        int color = pickColorByChar(lastChar); 

        // Span to set char color 
        ForegroundColorSpan fcs = new ForegroundColorSpan(color); 

        // Set the text color for the last character 
        lastSpannableChar.setSpan(fcs, 0, 1, Spannable.SPAN_INCLUSIVE_INCLUSIVE); 

        // append the last char to the string builder so you can keep the previous span 
        mSpannableStringBuilder.append(lastSpannableChar); 

        mEditText.setText(mSpannableStringBuilder); 
        mEditText.setSelection(mEditText.getText().length()); //this is to move the cursor position 

        mEditText.addTextChangedListener(this); 

       } 
      } 
     }); 
    } 

    public int pickColorByChar(String aChar){ 
     return COLORS_MAP.get(aChar); 
    } 
} 

この

は結果である

enter image description here

+0

「// TODO最後の文字を取得し、char色を設定することに基づいて色を変更する」に何かを追加する必要がありますか? ?それは上記のコードだけではうまくいかないからです。 – lifeBalkan

+0

私は答えをより多くのコードで更新しました。今あなたが尋ねたものになるはずです; – br00

+0

私の答えはあなたの問題を解決しましたか? @lifeBalkan – br00

関連する問題