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:
(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.
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:
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:
Vous avez spécifié une valeur absolue pour cette dimension (largeur ou hauteur).
Vous avez défini Contrainte dans les deux sens
Par exemple:
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 ...
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.
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. "
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"
/>
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.
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).
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);
}