2016-07-28 84 views
1

我正在試着用edittext寫成不同顏色的字符。 例如,我想在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

是的,它是使用spannable用於內部的TextView着色,得到你需要使用的方法來獲得索引指數的好方法「A」 – Chol

+0

謝謝你的回答。然而,我所尋找的是取決於特定角色的顏色的方式,以便每當鍵入「a」時它就變成紅色。例如,以下示例中只有三個字母爲紅色,超出了其索引。例如)「我有一個蘋果。」 – 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(final SimpleViewHolder viewHolder,final int position){Map colors = new HashMap (); colors.put(「*」,「#ffffff」); viewHolder.pwInput.setText(convertToHtml(myDatasetCopy.get(position).getPwInput(),colors)); ......} – lifeBalkan

+0

並且在與上述相同的類中(在適配器中)具有'convertToHtml'方法。 ** private static final String FONT_REPLACEMENT =「%2 $ s」; private static final String DEFAULT_COLOR =「#000000」; public Spanned convertToHtml(String text,Map colorSets){ } – lifeBalkan

+0

String altered =「<![CDATA [」;對於(int i = 0; i 」); **我在這裏得到的是' lifeBalkan

1

是的,它是可能的,但我不知道,如果是在性能方面過於昂貴。 您可以使用TextWatcher爲您最後插入的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獲取最後一個字符並根據您設置的字符顏色更改顏色」 ?因爲它不適用於上述代碼。 – lifeBalkan

+0

我用更多的代碼更新了我的答案。現在的例子應該是你問的;) – br00

+0

我的答案解決了你的問題嗎? @ lifeBalkan – br00

相關問題