Définir la largeur de TextView en termes de caractères

88

Je cherche vraiment une réponse à cela .

Vous souhaitez définir la largeur d'un TextView en fonction d'un nombre ou de caractères. Donc, si je veux qu'il soit toujours large de 3 caractères, je pourrais le définir et il s'ajustera en fonction du paramètre textSize. Sans cela, je dois définir une largeur à 50dip ou quelque chose du genre, ce qui peut ou non être correct en fonction de la taille de la police.

Fraggle
la source
Il existe peut-être un moyen de le faire en spécifiant votre dimension dans sp.
CommonsWare
@CommonsWare, ouais, si vous pouvez me dire combien de SP équivalent à un caractère qui pourrait fonctionner (mais voyez ma réponse ci-dessous en utilisant minEms car je pense que c'est ce que je veux). Donc, si la taille du texte = 30sp et que je veux 3 caractères de large, dois-je définir la largeur à 90sp? Je suppose que je pourrais l'essayer.
Fraggle
2
Ouais, minEmsc'est probablement une meilleure réponse.
CommonsWare

Réponses:

177

Répondre à ma propre question ...

Et le gagnant est: définissez l' minEmsattribut ( android:minEms) !!!

Donc, " ems " fait référence à la taille du caractère le plus large, généralement un "M", compris? Ainsi, la définition de minEms sur une valeur entière, disons 3, sur un EditText ou TextView doit garantir une largeur d'au moins 3 caractères. Vous pouvez également définir les maxEms.

Donc la réponse de Kyle sur ce fil, bien que fausse, m'a amené à trouver la réponse, alors merci Kyle.

Fraggle
la source
3
bien sûr, je suis toujours en train de tester pour voir si cela fonctionne réellement, mais jusqu'à présent, ça y ressemble.
Fraggle
8
Notez également que cela layout_widthdoit être wrap_contentpour que minEms et maxEms fonctionnent comme prévu, comme le souligne cette réponse .
Jonik
0

La plupart des polices ne définissent pas toutes les largeurs de caractères pour qu'elles soient identiques. Courier est peut-être l'exception la plus utilisée à cela, mais regardez généralement la différence entre un i et un A, par exemple. Cela rend ce que vous demandez de faire un peu un problème.

mah
la source
à droite, alors j'espérais que ce problème avait été résolu. Définissez donc la largeur en termes de caractères, puis, au moment de l'affichage, découvrez les caractéristiques de la police pour ce champ et déterminez sa taille en fonction de cela. Alors vraiment demander si ce problème avait été résolu, d'une manière très simple. Sonne comme non.
Fraggle
0

Essayez d'utiliser: android:maxLength="3"

Cela limitera votre texte à un nombre spécifique de caractères.

KyleM
la source
0

ems, contrairement aux croyances populaires (ou du moins de la plupart des discussions sur les ems ici), n'est pas basée sur la largeur d'un seul «M».

C'était à l'origine comme ça en typographie, mais sur support numérique, y compris Android, sa signification a été décalée vers la taille de la police utilisée, ou en d'autres termes, sa hauteur (à l'exclusion de tout rembourrage pour les accents / signes diacritiques).

Cela signifie que lorsque vous spécifiez le emspour un TextView, il l'utilisera textSizecomme base et le multipliera par le emsspécifié.

À titre d'exemple, si vous définissez un TextView 16sp emssur 4, sa largeur sera de 64sp. Vous pouvez facilement le tester en utilisant deux TextView (avec includeFontPaddingla valeur false) côte à côte dans un ConstraintLayout (pour en tirer parti layout_constraintDimensionRatio).

Andrei Stakov
la source