2016-07-28 237 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

相关问题