web-dev-qa-db-fra.com

Le redimensionnement automatique de TextView ne fonctionne pas (Android O)

J'utilise une nouvelle fonctionnalité de redimensionnement automatique ajoutée à la bibliothèque de support technique 26. J'ai lu une documentation disponible à l'adresse suivante: https://developer.Android.com/preview/features/autosizing-textview.html

Je suppose que cela devrait fonctionner ainsi: Vous pouvez activer le dimensionnement automatique avec cet attribut: app:autoSizeTextType="uniform". Je pense que TextView devrait utiliser tout l'espace disponible pour afficher un texte entier (pas seulement une partie - il ne devrait pas être rogné) et que textSize devrait être aussi grand que possible. Si vous devez limiter la taille maximale ou minimale du texte, vous pouvez utiliser ces deux attributs:

app:autoSizeMinTextSize="XXsp" // (you can also use px or dp values.)

ou

app:autoSizeMaxTextSize="XXsp"

Jusqu'ici tout va bien. Disons que j'ai besoin d'un TextView d'une largeur de 56dp. J'ai des textes de longueur différente et je souhaite définir ces textes sur TextView. Il devrait être automatiquement redimensionné pour afficher tout le texte (tous les caractères + non rogné) dans la plus grande possible textSize

Ceci est mon TextView:

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

Malheureusement, la vue texte est recadrée. Je voulais définir cette chaîne comme un texte à la TextView ci-dessus: "Groupa" mais voici le résultat:  enter image description here

(TextView se trouve dans ConstraintLayout avec un arrière-plan de cercle jaune.)

Comme vous pouvez le voir, la vue texte n’est pas redimensionnée du tout. Avez-vous une idée de ce qu'il faut faire? 

Merci.

35
Josef Hruška

J'ai testé cela pour quelques situations et voici la conclusion:

Vous devez avoir la largeur délimitée et hauteur. Par exemple, si vous définissez la largeur sur match_parent mais wrap_content pour la hauteur, je pense qu'Android ne sait pas à quelle hauteur vous souhaitez étirer votre texte. Dans votre exemple, vous n'avez pas de hauteur spécifique, je pense donc que cela ne fonctionne pas.

Par exemple:

wrap content height for a text

specific height for a text

Je ne sais pas pourquoi le document officiel Android utiliserait wrap_content comme exemple ...

Et comme vous pouvez le constater, je n’ai pas utilisé d’autres attributs dans mon exemple, ce n’est donc probablement pas le problème des attributs incorrects.

Et oui, le TextView que j'utilise est Android.support.v7.widget.AppCompatTextView.

Et tant que vous utilisez la bibliothèque de support 26.0.0 ou une version ultérieure, cela suffit.

MODIFIER:

En ce qui concerne ConstraintLayout, le principe est le même. Vous devez avoir à la fois une largeur et une hauteur délimitées, ce qui signifie soit l’un des deux en-dessous pour chaque dimension:

  1. Vous avez spécifié une valeur absolue pour cette dimension (largeur ou hauteur).

  2. Vous avez défini Contrainte dans les deux sens

Par exemple:

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

MISE À JOUR: (2017-09-21)

J'ai testé que malheureusement, il semble qu'il ne supporte pas encore les polices de caractères personnalisées, une fonction publiée ensemble dans la bibliothèque de support v26 ...

35
Sira Lam

En plus des réponses correctes, j'ai trouvé un autre point qui empêche le redimensionnement automatique de fonctionner.

N'utilisez pas Android:singleLine="true" avec le redimensionnement automatique. Utilisez plutôt le Android:maxLines="1" plus récent.

27
Henning

Quelle valeur avez-vous définie pour Android: attribut layout_height?

A partir du document : "Si vous définissez la réduction automatique dans un fichier XML, il est déconseillé d'utiliser la valeur" wrap_content "pour les attributs layout_width ou layout_height d'un TextView. Cela peut produire des résultats inattendus. "

5
John Le

Configurez votre TextView comme ceci

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

Fonctionne bien sur Android 22, 23, 26
 enter image description here

3
Linh

Dans mon cas, le problème était très stupide: même si la réduction automatique de taille a toujours fonctionné pour moi, sur exactement un TextView, j’ai utilisé l’espace de nom Android: au lieu de app:! J'étais totalement inconscient de mon erreur et je me demandais pourquoi cela ne fonctionnait pas. Ainsi, lorsque vous utilisez un thème AppCompat, veillez à toujours utiliser les attributs AppCompat et non les attributs natifs.

3
0101100101

Avez-vous essayé de définir les quatre attributs décrits dans le lien que vous avez posté?

Par exemple. 

app:autoSizeTextType="uniform"
app:autoSizeMaxTextSize="13sp"
app:autoSizeMinTextSize="5sp"
app:autoSizeStepGranularity="1sp"

Vous pouvez également essayer de définir largeur et hauteur sur wrap_content, et de définir minWidth et maxWidth sur 56dp.

Comme mentionné dans les commentaires, maxlines semble poser des problèmes (pour moi aussi), essayez donc de le supprimer (l'autosizing devrait probablement s'en occuper en réduisant la taille du texte).

2
FJJ

si vous ne connaissez pas la taille de textview. par exemple. vous les mettez en linéaire et définissez la hauteur ou la largeur sur 0dp. alors j'ai eu une solution. vous devez définirAutoSizeTextTypeWithDefaults dans l'événement OnSizeChanged.

@Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        this.setAutoSizeTextTypeWithDefaults(AUTO_SIZE_TEXT_TYPE_UNIFORM);

    }
1
William