Ich verwende die neue Funktion zur automatischen Größenänderung in der Support-Bibliothek 26. Ich habe eine Dokumentation gelesen, die hier zu finden ist: https://developer.Android.com/preview/features/autosizing-textview.html
Ich nehme an, dass es so funktionieren sollte: Sie können die automatische Größenanpassung mit diesem Attribut aktivieren: app:autoSizeTextType="uniform"
. Ich denke, dass TextView
den gesamten verfügbaren Platz verwenden sollte, um einen ganzen Text anzuzeigen (nicht nur einen Teil - er sollte nicht beschnitten werden), und textSize
sollte so groß wie möglich sein. Wenn Sie die maximale oder minimale Größe des Textes begrenzen müssen, können Sie diese beiden Attribute verwenden:
app:autoSizeMinTextSize="XXsp" // (you can also use px or dp values.)
oder
app:autoSizeMaxTextSize="XXsp"
So weit, ist es gut. Nehmen wir an, ich brauche eine TextView mit 56dp Breite. Ich habe Texte mit einer anderen Länge, und ich möchte diese Texte auf dieses _ TextView
setzen. Die Größe sollte automatisch angepasst werden, sodass der gesamte Text (alle Zeichen + nicht zugeschnitten) in der größtmöglichen Größe von _ textSize
angezeigt wird.
Das ist meine Textansicht:
<Android.support.v7.widget.AppCompatTextView
Android:id="@+id/vName"
style="@style/TextView.AutoSize"
Android:layout_width="56dp"
Android:gravity="bottom|center_horizontal"
Android:maxLines="1"
app:autoSizeMinTextSize="1px"
app:autoSizeTextType="uniform"
app:layout_constraintBottom_toTopOf="@id/vGuideline"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent" />
Leider wird die Textansicht abgeschnitten. Ich wollte diesen String als Text auf die TextView oben setzen: "Groupa", aber dies ist das Ergebnis:
(TextView befindet sich in ConstraintLayout mit gelbem Kreishintergrund.)
Wie Sie sehen, hat die Textansicht überhaupt keine Größenänderung. Hast du eine Idee, was zu tun ist?
Vielen Dank.
Ich habe dies für einige Situationen getestet und habe die folgende Schlussfolgerung:
Sie müssen Breite und Höhe begrenzt haben. Wenn Sie beispielsweise width als match_parent
aber wrap_content
für die Höhe festlegen, ist Android der Meinung, dass Android nicht weiß, wie hoch Sie Ihren Text strecken möchten. In Ihrem Beispiel haben Sie keine bestimmte Höhe, daher denke ich, dass es nicht funktioniert.
Zum Beispiel:
Ich weiß nicht, warum Android offizielles Dokument wrap_content als Beispiel verwenden würde ...
Und wie Sie sehen, habe ich in meinem Beispiel keine anderen Attribute verwendet, daher handelt es sich wahrscheinlich nicht um fehlerhafte Attribute.
Und ja, das TextView, das ich verwende, ist Android.support.v7.widget.AppCompatTextView.
Und solange Sie die Unterstützungsbibliothek 26.0.0 oder höher verwenden, ist dies gut genug.
BEARBEITEN:
Bei ConstraintLayout
ist das Prinzip dasselbe. Sie sollten sowohl eine begrenzte Breite als auch eine begrenzte Höhe haben. Dies bedeutet, dass für jede Dimension eine der folgenden Angaben gilt:
Sie haben einen absoluten Wert für dieses Maß (Breite oder Höhe) angegeben.
Sie haben Constraint für beide Richtungen festgelegt
Zum Beispiel:
UPDATE: (2017-09-21)
Ich habe getestet, dass es anscheinend noch keine benutzerdefinierte Schriftart unterstützt, eine Funktion, die zusammen in der Unterstützungsbibliothek v26 veröffentlicht wird.
Zusätzlich zu den anderen richtigen Antworten fand ich einen weiteren Punkt, der das Funktionieren der automatischen Anpassung verhindert.
Verwenden Sie Android:singleLine="true"
nicht zusammen mit der automatischen Einstellung. Verwenden Sie stattdessen den neueren Android:maxLines="1"
.
Ich hatte das gleiche Problem ... Ich löste es, indem ich zwei Zeilen in meinem Gradle änderte: compile 'com.Android.support:support-v4:26.0.1'
und compile 'com.Android.support:appcompat-v7:26.0.1'
Um längere Texte einfügen zu können, müssen Sie alle vier Optionen hinzufügen:
<Android.support.v7.widget.AppCompatTextView
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:text="@string/your_string"
app:autoSizeTextType="uniform"
app:autoSizeMaxTextSize="13sp"
app:autoSizeMinTextSize="5sp"
app:autoSizeStepGranularity="1sp"/>
Welchen Wert haben Sie auf Android gesetzt: layout_height-Attribut?
Aus dem Dokument : "Wenn Sie in einer XML-Datei die automatische Größenanpassung festlegen, wird nicht empfohlen, den Wert" wrap_content "für die Attribute layout_width oder layout_height einer TextView zu verwenden. Dies kann zu unerwarteten Ergebnissen führen."
Konfigurieren Sie Ihre TextView
so
<TextView
Android:id="@+id/vName"
Android:layout_width="56dp"
Android:layout_height="wrap_content"
Android:maxLines="1"
Android:text="Groupa"
app:autoSizeMinTextSize="12sp"
app:autoSizeMaxTextSize="20sp"
app:autoSizeTextType="uniform"
/>
In meinem Fall war das Problem etwas sehr Dummes: Während das Autosizing für mich immer gut funktionierte, habe ich bei genau einem TextView den Namespace Android:
anstelle von app:
verwendet! Ich war mir meines Fehlers völlig bewusst und wunderte mich immer wieder, warum es nicht funktionierte. Wenn Sie also ein AppCompat
-Design verwenden, stellen Sie sicher, dass Sie die AppCompat
-Attribute verwenden, nicht die nativen.
Haben Sie versucht, alle vier Attribute einzustellen, die in dem von Ihnen geposteten Link beschrieben werden?
Z.B.
app:autoSizeTextType="uniform"
app:autoSizeMaxTextSize="13sp"
app:autoSizeMinTextSize="5sp"
app:autoSizeStepGranularity="1sp"
Sie können auch versuchen, Breite und Höhe auf wrap_content und minWidth und maxWidth auf 56dp einzustellen.
Wie möglicherweise auch in den Kommentaren erwähnt, scheint maxlines Probleme zu verursachen (auch für mich), also versuchen Sie es zu entfernen.
wenn Sie nicht wissen, wie groß die Textansicht ist. z.B. Sie setzen sie in lineares Layout und setzen Höhe oder Breite auf 0dp. dann habe ich eine lösung. Sie müssenAutoSizeTextTypeWithDefaults im OnSizeChanged-Ereignis festlegen.
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
this.setAutoSizeTextTypeWithDefaults(AUTO_SIZE_TEXT_TYPE_UNIFORM);
}
Zusätzliche Informationen zu @Sira Lams akzeptierter Antwort:
Stellen Sie immer sicher, dass Sie keine Attribute erben, die im Konflikt mit dem Verhalten von AutoTextSize stehen könnten, insbesondere Android:singleLine
.
Obwohl Android:maxLines
oder Android:lines
nicht hindert das TextView
daran, die Größe entsprechend anzupassen, das singleLine
Attribut (wenn es auf true gesetzt ist) deaktiviert es vollständig Beliebige automatische Größenanpassung.
Wenn Sie also ein AutoTextSize-Problem aufspüren, versuchen Sie zunächst, nach dem singleLine
-Attribut zu suchen, da es manchmal beim Erweitern von Button
vererbt wird.
Stellen Sie sicher, dass Android:maxLines=1
wie @Henning sagte.
<androidx.appcompat.widget.AppCompatTextView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:gravity="center"
Android:textColor="@color/white"
Android:textSize="16sp"
Android:textStyle="bold"
Android:maxLines="1"
app:autoSizeMaxTextSize="16sp"
app:autoSizeMinTextSize="12sp"
app:autoSizeTextType="uniform"
tools:text="Downloading" />