Wenn ich ein TextView
mit einem \n
im Text habe, habe ich rechts zwei singleLine
TextView
s untereinander ohne Abstand dazwischen. Ich habe für alle drei TextView
s Folgendes eingestellt .
android:lineSpacingMultiplier="1"
android:lineSpacingExtra="0pt"
android:paddingTop="0pt"
android:paddingBottom="0pt"
Die erste Zeile links TextView
stimmt perfekt mit der oberen rechten überein TextView
.
Die zweite Zeile links TextView
ist etwas höher als die zweite Zeile unten rechts TextView
.
Es scheint, dass es eine Art versteckte Polsterung oben und unten am TextView
s gibt. Wie kann ich das entfernen?
Antworten:
oder in
XML
diesem wäre:Stellen Sie ein, ob die
TextView
zusätzliche obere und untere Polsterung Platz für Akzente bietet, die über den normalen Auf- und Abstieg hinausgehen. Der Standardwert ist true.quelle
1dp
obere / untere Polsterung zu haben, irre ich mich? (Ich benutzeDeveloper options -> Show layout bounds
)includeFontPadding="false"
entfernt zwar einen Teil des Speicherplatzes, aber nicht den gesamten. sehr eigenartig.includeFontPadding
eignet sich hervorragend zum Entfernen zusätzlicher Auffüllungen aus der Schriftart selbst, kann jedoch Probleme in Sprachen mit Auf- und Abwärtsbewegungen verursachen. Ich würde sicherstellen, dass Sie Sprachen wie Spanisch und Thailändisch testen, wenn Sie dies unterstützen.Ich fühle deinen Schmerz. Ich habe jede Antwort oben ausprobiert, einschließlich der
setIncludeFontPadding
zu falschen, die nichts für mich getan hat.Meine Lösung?
layout_marginBottom="-3dp"
auf derTextView
gibt Ihnen eine Lösung für den Boden, BAM!Obwohl -3dp on
layout_marginTop
fehlschlägt .... ugh.quelle
Ich habe viel nach der richtigen Antwort gesucht, aber keine, wo ich eine Antwort finden konnte, die genau die gesamte Polsterung aus der entfernen konnte
TextView
, aber schließlich, nachdem ich das offizielle Dokument durchgesehen hatte, bekam ich eine Lösung für einzeilige TexteDas Hinzufügen dieser beiden Zeilen zu
TextView
XML erledigt die Arbeit.Das erste Attribut entfernt den für Akzente reservierten Abstand und das zweite Attribut entfernt den reservierten Abstand, um den richtigen Abstand zwischen zwei Textzeilen aufrechtzuerhalten.
quelle
fontPath
Attribut entfernen ?Wenn Sie
AppCompatTextView
(oder abAPI 28
) verwenden, können Sie die Kombination dieser beiden Attribute verwenden, um den Abstand in der ersten Zeile zu entfernen:XML
Kotlin
quelle
Das ärgerte mich auch und die Antwort, die ich fand, war, dass tatsächlich zusätzlicher Platz in der Schriftart selbst vorhanden ist, nicht in der Textansicht. Aufgrund des Hintergrunds der Dokumentveröffentlichung ist es ziemlich irritierend, wie wenig Kontrolle Sie mit Android über typografische Elemente haben. Ich würde empfehlen, eine benutzerdefinierte Schriftart zu verwenden (z. B. Bitstream Vera Sans, die für die Weiterverteilung lizenziert ist), bei der dieses Problem möglicherweise nicht auftritt. Ich bin mir jedoch nicht sicher, ob dies der Fall ist oder nicht.
quelle
Sie können versuchen, dieses Attribut (ConstraintLayout) zu verwenden:
layout_constraintBaseline_toBaselineOf
So was:
quelle
Ich entferne den Abstand in meiner benutzerdefinierten Ansicht - NoPaddingTextView.
https://github.com/SenhLinsh/NoPaddingTextView
quelle
Mit einer zusätzlichen ImageView können wir die TextView so einstellen, dass sie an der ImageView ausgerichtet ist, und die festlegen
android:baselineAlignBottom
auf der ImageView auf true setzen, wodurch die Grundlinie von ImageView nach unten verschoben wird. Andere Ansichten können sich am unteren Rand der ImageView ausrichten, was der Grundlinie der TextView entspricht.Dies fixiert jedoch nur die Polsterung unten, nicht die Oberseite.
quelle
Ich denke, dieses Problem kann folgendermaßen gelöst werden:
Das sind die Ergebnisse:
Screenshot-1
Screenshot-3
Obwohl die Zeile der Sonderzeichen in rightLowerText etwas höher aussieht als die zweite Zeile von leftText, sind ihre Basislinien weiterhin ausgerichtet.
quelle
Da meine Anforderung darin besteht, die vorhandene textView zu überschreiben
findViewById(getResources().getIdentifier("xxx", "id", "android"));
, kann ich es nicht einfach versuchenonDraw()
andere Antwort .Aber ich finde nur die richtigen Schritte heraus, um mein Problem zu beheben. Hier ist das Endergebnis von Layout Inspector:
Da ich nur die oberen Leerzeichen entfernen wollte, muss ich keine andere Schriftart auswählen, um die unteren Leerzeichen zu entfernen.
Hier ist der kritische Code, um das Problem zu beheben:
Der erste Schlüssel ist die benutzerdefinierte Schriftart "fonts / myCustomFont.otf", die den Platz unten, aber nicht oben hat. Sie können dies leicht herausfinden, indem Sie die otf-Datei öffnen und auf eine beliebige Schriftart in Android Studio klicken:
Wie Sie sehen können, hat der Cursor unten einen zusätzlichen Abstand, aber nicht oben, sodass mein Problem behoben wurde.
Der zweite Schlüssel ist, dass Sie den Code nicht einfach überspringen können , da er sonst möglicherweise nicht funktioniert. Das ist der Grund, warum einige Leute kommentieren, dass eine Antwort funktioniert, und andere kommentieren, dass sie nicht funktioniert.
Lassen Sie uns veranschaulichen, was passieren wird, wenn ich einen von ihnen entferne.
Ohne
setTypeface(mfont);
:Ohne
setPadding(0, 0, 0, 0);
:Ohne
setIncludeFontPadding(false);
:Ohne 3 von ihnen (dh das Original):
quelle
Das einzige was funktioniert hat ist
quelle
Einfache Methode funktioniert:
Wenn es nicht funktioniert hat, versuchen Sie, dies über dem Code hinzuzufügen:
Wenn Sie mehrere Zeilen benötigen, müssen Sie möglicherweise die Höhe des Auffüllens oben und unten über die temporäre TextView-Zeile (vor und nach dem Entfernen des Auffüllens) genau berechnen und dann das Ergebnis zum Verringern der Höhe mit negativem Auffüllen oder ein Ghost-Layout mit translate Y anwenden. Lol
quelle
XML aktualisiert
quelle
Möglicherweise möchten Sie versuchen, den unteren Rand der linken Textansicht am unteren Rand der zweiten rechten Textansicht auszurichten.
quelle
Meines Wissens ist dies den meisten Widgets eigen, und das Ausmaß der "Auffüllung" ist bei den Telefonherstellern unterschiedlich. Diese Auffüllung ist ein wirklich weißer Raum zwischen dem Bildrand und dem Bild in der 9-Patch-Bilddatei.
Zum Beispiel erhalten Spinner-Widgets auf meinem Droid X mehr Leerraum als Schaltflächen, was es unangenehm macht, wenn Sie einen Spinner inline mit einer Schaltfläche haben, aber auf dem Telefon meiner Frau hat dieselbe Anwendung nicht das gleiche Problem und sieht großartig aus!
Der einzige Vorschlag, den ich hätte, ist, eigene 9 Patch-Dateien zu erstellen und diese in Ihrer Anwendung zu verwenden.
Ahhh die Schmerzen, die Android sind.
Bearbeitet: Polsterung gegen Leerraum klären.
quelle
Dieser Trick hat bei mir funktioniert (für min-sdk> = 18 ).
Ich benutzte
android:includeFontPadding="false"
und eine negative Marge wieandroid:layout_marginTop="-11dp"
und legte meineTextView
innen einFrameLayout
( oder eine beliebige Viewgroup ... )und schließlich Beispielcodes:
quelle
Sieh dir das an:
Richten Sie ImageView horizontal mit EditText aus
Es scheint, dass das Hintergrundbild von EditText einige transparente Pixel enthält, die auch eine Auffüllung hinzufügen.
Eine Lösung besteht darin, den Standardhintergrund von EditText in etwas anderes zu ändern (oder nichts, aber kein Hintergrund für einen EditText ist wahrscheinlich nicht akzeptabel). Das kann gemacht werden, indem das XML-Attribut android: background eingestellt wird.
quelle
Einfach benutzen
quelle
Verwenden Sie dies in Ihrer ImageView-XML
android: adjustViewBounds = "true"
quelle