Ich habe stundenlang nach Antworten gesucht und habe wirklich keine Ahnung, wie ich das lösen soll. Kommen wir also zur Sache:
Es gibt ein Bild und ein TextView
und ich muss den TextView
um den ImageView
wie folgt fließen lassen:
Die erste mögliche Lösung wäre Ссылка , aber es wird nicht TextView
erweitert, so dass diese Bibliothek nicht für mich geeignet ist aus Gründen.
Die zweite Lösung wäre die Verwendung von LeadingMarginSpan.LeadingMarginSpan2
span, wirkt sich jedoch auf jeden Absatz für jede n Zeilen innerhalb des Textes aus (wie in dieser Antwort - & gt; Wie Layout-Text um ein Bild fließen ), so bekomme ich etw:
Aber ich wollte den Rand nur für die ersten n Zeilen setzen! Dann entschied ich, LeadingMarginSpan.Standart
zu implementieren und einen Zähler zu erstellen und ihn in getLeadingMargin(first: Boolean): Int
function incruf zu erhöhen. Wenn der Zähler den gewünschten Wert erreicht, gibt die Funktion 0 als Randbreite zurück. Und es gibt wieder ein Versagen! Anstatt die TextView
-Zeilen zu füllen, ist der Text gerade nach links gegangen und hat sich nicht bis zum Ende der Ansicht ausgebreitet!
UPD: Ja, ich habe onGlobalLayoutListener
hier verwendet
Nun, für eine andere Lösung googeln fand ich diese Antwort Ссылка Ok, ich habe alles wie beschrieben gemacht und den Code implementiert:
%Vor% Mein OnGlobalLayoutListener
sieht so aus: '
'
Nun, es funktioniert. Aber wie schrecklich es funktioniert! Da ich das Viewholder-Muster verwende, muss ich eine Variable zum Listener halten und entfernen, wenn sie nicht aufgerufen und erfolgreich entfernt wurde, weil onGlobalLayout
function nicht rechtzeitig aufgerufen wurde! Und es heißt zu spät, also musst du etwa 300 ms warten und dann die "Rekonstruktion" des TextView
anschauen und es sieht ekelhaft aus!
Also, meine Frage ist:
Wie werden Ränder für erste n Zeilen in TextView
erstellt, bevor sie auf der Benutzeroberfläche gezeichnet wurden?
Endlich habe ich die beste Lösung gefunden. Es basiert auf dem Erstellen eines Modells von TextView
der gewünschten Breite mit StaticLayout
TextView
(subtrahieren Sie nur die Seitenpolster und die Breite des Bildcontainers von der Darstellungsbreite) in Pixel. StaticLayout
Zeilenumbrüche ( "\n"
oder "\r"
). Daher müssen wir unsere Zeichenfolge in einzelne, nichtbrechende Zeilen aufteilen, um das TextView
erfolgreich nachzubilden. Layout:
%Code%
Anschließend erstellt der folgende Algorithmus val commentParts = spannable.toString().split("\r")
-Instanzen für jede Zeile und überprüft, ob die Zeilen die Höhe des Bildcontainers überschreiten. Falls dies der Fall ist, können wir schließlich die Position des letzten Zeichens der letzten Zeile rechts neben dem Bildcontainer erhalten. Und dann müssen wir selbst einen Zeilenumbruch erstellen, damit StaticLayout
die Margen ab LeadingMarginSpanLayout
char position stoppen kann:
Und das letzte, setze [end + 1]
auf die spannbare Zeichenkette:
Eventuell ist die Zeitspanne richtig eingestellt!
Tags und Links android user-interface kotlin android-textview