webentwicklung-frage-antwort-db.com.de

Autosizing von TextView funktioniert nicht (Android O)

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:  enter image description here

(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.

35
Josef Hruška

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:

wrap content height for a text

specific height for a text

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:

  1. Sie haben einen absoluten Wert für dieses Maß (Breite oder Höhe) angegeben.

  2. Sie haben Constraint für beide Richtungen festgelegt

Zum Beispiel:

All 4 directions are constrainedHeight set to be an absolute valueWidth set to be an absolute value

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.

35
Sira Lam

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".

27
Henning

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"/>
7
Apollo

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."

5
John Le

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"
    />

Funktioniert gut mit Android 22, 23, 26
 enter image description here

3
Linh

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.

3
0101100101

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.

2
FJJ

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

    }
1
William

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:linesnicht 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.

1
R B

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" />
0
dastan