Buchstabe nach Buchstabe im String ändern.

  • Antworten:6
Gelöschter Account
  • Forum-Beiträge: 2.492

03.02.2014, 18:23:35 via Website

Hallo,

ich habe ein Text in einem TextView und wenn man über ein EditText etwas eingibt komme ich in der onTextChanged Methode mit einem Substring auf den letzten eingegebenen Buchstaben. Jetzt möchte ich, wenn man etwas eingibt, dass im TextView Buchstabe für Buchstabe farblich geändert wird.
Ich habe das bisher mit einem SpannableString(Builder) probiert, aber das scheint mir ziemlich umständlich, den ganzen Text im TextView zu teilen in einen vorderen und hinteren dann den vorderen zu färben und wieder beides zusammen zu fügen. Und das dann bei jedem eigegebenen Buchstaben.
Gibt es eine einfachere Möglichkeit einzelne Buchstaben im Text zu färben?

Gruß
Lars

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

03.02.2014, 18:44:52 via Website

Eigentlich geht das nicht einfacher, du könntest als alternative HTML Code nutzen und den in die TextView Bringen, aber das ist noch aufwändiger, da du die Farbe in einem Font tag für jeden Buchstabe festlegen musst.
Wenn du das mit den SpannableStrings schon hast, dann poste mal den Code. So umständlich dürfte er nicht sein.
Ist ja eigentlich immer das gleiche, was du machen musst.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
impjor
  • Forum-Beiträge: 1.793

03.02.2014, 18:47:13 via App

Ich würde mir eine kleine Klasse wie z.B. ColoredSpannableHelper schreiben, die Methoden wie addChar(char c, Color c) oder changeColor(int pos, Color c) und setToTextView(TextView tv) anbieten. Dann sollte in der eigentlichen onTextChanged kaum Code anfallen und die Klasse auch nicht sonderlich groß sein.

LG

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
Gelöschter Account
  • Forum-Beiträge: 2.492

03.02.2014, 20:09:10 via Website

1SpannableString richtig = new SpannableString(letzterBuchstabeStr);
2 richtig.setSpan(new ForegroundColorSpan(Color.YELLOW), 0, letzterBuchstabeStr.length(), 0);
3 builder.clear();
4 builder.append(bisherRichtig);
5 builder.append(richtig);
6 builder.append(ausgabeText.substring(richtig.length(), ausgabeText.length()));
7 ausgabe.setText(builder, BufferType.SPANNABLE);
8 bisherRichtigStr = bisherRichtigStr.toString() + richtig.toString();
9 bisherRichtig = new SpannableString(bisherRichtigStr);
10 bisherRichtig.setSpan(new ForegroundColorSpan(Color.YELLOW), 0, bisherRichtigStr.length(), 0);
11position++;
letzterBuchstabeStr ist der letzte eigegebene Buchstabe
bisherRichtig sind alle bisherigen Buchstaben die Gelb geschrieben worden sind
richtig ist dann der aktuelle Buchstabe+
ausgabeText.substring... ist dann der Rest des Textes der noch nicht weiter betrachtet worden ist
ausgabe ist das TextView
bisherRichtig ist dann das bisher Gelbe als Span um es beim nächten Durchlauf dem builder hinzuzufügen

Nur funktioniert das immer noch nicht richtig, weil der komplette alte Text (bis auf den ersten Buchstaben) dahinter geschrieben wird.
So sieht es dann ja nicht so aus als wenn der Buchstabe nur die Farbe ändert.

Die Idee mit der Klasse ist gut, das probier ich mal aus.

Gruß
Lars

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

03.02.2014, 20:15:21 via App

Mach doch ein SpannableString für den rest des Textes und addest immer den SpanableString des aktuellen buchstabens. Somit musst du nicht immer den ganzen text neu färben

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Gelöschter Account
  • Forum-Beiträge: 2.492

03.02.2014, 21:04:40 via Website

Der Spannable String der aktuellen Buchstabens muss ja davor.
Oder ich versteh nicht so richtig wie du das meinst.

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

03.02.2014, 22:03:12 via App

Wieso?
Wenn du jetzt das Wort Hallo in eine EditText schreibst,jeden Buchstaben einzeln.
Dann in der Change fragst du den Eingetippten buchstaben ab und Färbst ihn ein.
Nun brauchst du ein String indem du die Buchstaben aneinander reihst da sie in der Richtigen Reihenfolge eingetippt werden.
Also beim H wird das H gelb eingefärbt und dann zur collection hinzugefügt. beim nächsten onChange event aufruf machst du das gleiche nochmal nur mit dem a und so weiter.
Du brauchst dann halt eine SpannableSteing collection in dem alle gefärbten Buchstaben gespeichert werden

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten