2016-07-28 6 views
1

Ich versuche, Zeichen in edittext geschrieben mit einer anderen Farbe gefärbt. Zum Beispiel möchte ich "A" in rot die ganze Zeit haben, wenn es in edittext geschrieben wird, während die anderen in schwarz bleiben. Ist es zumindest möglich?Wie legen Sie verschiedene Farben für jedes Zeichen in editedtext in Android geschrieben?

Ich fand einige Antworten bezüglich der Farbeinstellung in edittext wie unten, aber es ist alles über Farbeinstellung durch den Bereich von Startindex und Endindex.

** Beispiel **

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

Ja, es ist die gute Möglichkeit, die spannable zum Färben von innen Textview zu verwenden, zu erhalten Index Sie Methode verwenden müssen, den Index zu bekommen für ‚a‘ – Chol

+0

Vielen Dank für die Antwort. Was ich jedoch suche, ist die Art und Weise, wie man die Farbe nimmt, hängt von einem bestimmten Charakter ab, so dass, wenn 'a' eingegeben wird, es zu rot wird. Zum Beispiel gibt es im folgenden Beispiel nur drei Buchstaben, die über ihre Indizes hinausgehen. ex) "Ich habe einen Apfel." – lifeBalkan

+0

Code-Formatierung – fantaghirocco

Antwort

0

Eine Möglichkeit wäre Html.fromHtml(String) zu verwenden und die Schriftfarben durch das Set eine Map auf Ihre vordefinierten Farben. z.B.

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 + "]]>"); 
} 

Und dann, es zu benutzen, Sie so etwas wie tun könnten:

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

Danke, aber es funktioniert nicht. Ich möchte, dass diese im Recyclerview geändert werden. Also, fügte obige Codes in bindView hold-Methode hinzu. ** public void onBindViewHolder (endgültiger SimpleViewHolder viewHolder, letzte int-Position) {Map colors = new HashMap (); colors.put ("*", "#ffffff"); viewHolder.pwInput.setText (convertToHtml (myDatasetCopy.get (position) .getPwInput(), Farben)); ......} – lifeBalkan

+0

und hatte die 'convertToHtml' Methode in der gleichen Klasse wie oben (im Adapter). ** private statische letzte Zeichenfolge FONT_REPLACEMENT = "% 2 $ s"; private statische letzte Zeichenfolge DEFAULT_COLOR = "# 000000"; public Spanned convertToHtml (String text, Karte colorSets) { } – lifeBalkan

+0

String geändert = ""); ** Was ich hier bekommen habe, ist lifeBalkan

1

Ja, es ist möglich, aber ich weiß nicht, ob in Bezug auf Leistung zu teuer. Sie können einen TextWatcher verwenden, um Ihre zuletzt eingefügte Base auf Ihrer Map of char-color einzufärben.

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); 
    } 
} 

Dies ist das Ergebnis

enter image description here

+0

Muss ich etwas hinzufügen in" // TODO bekomme das letzte Zeichen und ändere die Farbe basierend auf der eingestellten Zeichenfarbe " ? weil es nur mit obigen Codes nicht funktioniert. – lifeBalkan

+0

Ich habe meine Antwort mit mehr Code aktualisiert. Jetzt sollte das Beispiel sein, was du gefragt hast;) – br00

+0

Hat meine Antwort dein Problem gelöst? @lifeBalkan – br00

Verwandte Themen