Comment ajuster la taille de police de texte pour l'adapter à textview
Est-il de toute façon android pour régler le textsize dans un textview pour s'adapter à l'espace qu'il occupe?
E. g. Je suis à l'aide d'un TableLayout
et de l'ajout de plusieurs TextView
s à chaque ligne. Depuis que je ne veux pas le TextView
s pour envelopper le texte que j'ai plutôt voir qu'il diminue la taille de la police du contenu.
Des idées?
J'ai essayé measureText
, mais depuis que je ne connais pas la taille de la colonne, il semble pénible à utiliser.
C'est le code où je veux changer la taille de la police pour quelque chose qui correspond à
TableRow row = new TableRow(this);
for (int i=0; i < ColumnNames.length; i++) {
TextView textColumn = new TextView(this);
textColumn.setText(ColumnNames[i]);
textColumn.setPadding(0, 0, 1, 0);
textColumn.setTextColor(getResources().getColor(R.drawable.text_default));
row.addView(textColumn, new TableRow.LayoutParams());
}
table.addView(row, new TableLayout.LayoutParams());
De vérifier ma solution basée sur dunni code ici stackoverflow.com/questions/5033012/... Note: je n'ai pas la mettre en œuvre avec une boucle. PS: merci dunni
OriginalL'auteur rudas | 2010-04-11
Vous devez vous connecter pour publier un commentaire.
La solution ci-dessous regroupe toutes les suggestions ici. Il commence avec ce qui a été posté par Dunni. Il utilise une recherche binaire comme gjpc, mais il est un peu plus lisible. Il a également inclus la gregm de corrections de bugs et la correction d'un bug de mon propre.
Oh, il semble partiellement travail au moment de l'exécution. Sur un appareil ot émulateur, le texte est coupé à mi-chemin. Sur l'Éclipse de mise en page de l'éditeur, il a l'air bien. Des idées?
ce post ressemble, il fera l'affaire (l'ajout des attributs xml pour hi/lo): stackoverflow.com/a/8090772/156611
Ce fut une excellente solution! Dans le cas où quelqu'un d'autre est nouveau pour le développement android et ne sait pas trop comment mettre en œuvre une vue étendue en XML, il ressemble à ceci:
<com.example.zengame1.FontFitTextView android:paddingTop="5dip" android:id="@+id/childs_name" android:layout_width="fill_parent" android:layout_height="0dip" android:layout_weight="1" android:layout_gravity="center" android:textSize="@dimen/text_size"/>
Magnifique travail!!! Eu travaille également avec des boutons. Pour prendre soin de la textview hauteur venez de définir
float hi = this.getHeight() - this.getPaddingBottom() - this.getPaddingTop();
OriginalL'auteur speedplane
J'ai écrit une classe qui étend la classe TextView et ce. Il utilise juste savoir measuretext comme vous le suggérez. Fondamentalement, il a un maximum la taille du texte et le minimum de la taille du texte (qui peut être changé) et il fonctionne à travers les tailles entre eux dans décrémente de 1 jusqu'à ce qu'elle trouve le plus grand, qui sera adaptée. Pas particulièrement élégant, mais je ne sais pas de toute autre manière.
Voici le code:
je pense qu'il serait plus raisonnable de ne refitText à "onLayout" plutôt que "onSizeChanged"
Pouvez vous s'il vous plaît jeter un oeil à mon problème stackoverflow.com/questions/36265448/...
OriginalL'auteur dunni
C'est speedplane
FontFitTextView
, mais il ne diminue taille de la police si nécessaire, pour mettre le texte en forme, et conserve sa taille de police autrement. Il n'augmente pas la taille de la police pour s'adapter à la hauteur.Voici un exemple de la façon dont il pourrait être utilisé en xml:
Cela permettrait de garder la taille de la police pour 60sp tant que le texte s'adapte à la largeur. Si le texte est plus long, il va diminuer la taille de police. Dans ce cas, le
TextView
s hauteur va aussi changer à cause deheight=wrap_content
.Si vous trouvez des bugs, n'hésitez pas à modifier.
Comment avez-vous l'utiliser? J'ai ajouté un exemple de la façon dont je l'utilise pour ma réponse. Je l'ai testé avec différentes versions d'android, des émulateurs et ADT Graphique Mise en page de l'Éditeur.
Essentiellement, je n'étais pas la spécification d'une hauteur spécifique. Votre onMeasure est de permettre à la vue de prendre le relais si il veut. J'ai réussi à trouver une solution, changer à la dernière ligne dans la routine de
this.setMeasuredDimension(parentWidth, height);
Grande entrée, j'ai corrigé le code 🙂 Maintenant, il fonctionne avec
match_parent
etwrap_content
.merci de souligner ce point. l'équivalent de
text.isEmpty()
serait"".equals(text)
.OriginalL'auteur sulai
Voici ma solution qui fonctionne sur émulateur et les téléphones, mais pas très bien sur Eclipse mise en page de l'éditeur. Il est inspiré de kilaka du code, mais la taille du texte n'est pas obtenu à partir de la Peinture, mais à partir de la mesure de la TextView lui-même l'appel de
measure(0, 0)
.La classe Java :
L'attribut XML fichier :
Vérifier mon github pour la dernière version de cette classe.
J'espère que cela peut être utile pour quelqu'un.
Si un bug est trouvé ou si le code doit explication, n'hésitez pas à ouvrir un sujet sur Github.
Quel est votre problème sur les appareils avec des écrans de petite taille ?
Désolé, le problème n'est pas avec de petits écrans, de votre point de vue n'est pas de travail dans tous les appareils avec Android 4.0, émulateur inclus. J'ai ouvert de nouveau question dans votre GitHub
OriginalL'auteur yDelouis
Merci beaucoup pour https://stackoverflow.com/users/234270/speedplane. Super réponse!
Ici est une version améliorée de sa réponse qui prennent également soin de hauteur et est livré avec un maxFontSize attribut de limiter la taille de la police (a été utile dans mon cas, donc je voulais le partager) :
Correspondant /res/values/attr.xml fichier:
Exemple:
Pour utiliser le nouveau
maxFontSize
attribut, n'oubliez pas d'ajouterxmlns:res-auto="http://schemas.android.com/apk/res-auto"
comme le montre l'exemple.Oh.. Pourriez-vous me donner un cas pour lequel il n'a pas de travail? (Multi en ligne n'est pas pris en charge, vous avez raison)
De nombreux cas. J'ai créé un hasard testeur, juste pour prouver que c'est correct. Voici un exemple: la largeur de la vue:317px, hauteur: 137px , texte: "q7Lr" . Ce que je vois, c'est ceci: tinypic.com/view.php?pic=2dv5yf9&s=6 . voici l'exemple de projet que j'ai fait: mega.co.nz/... . Je pense que ce point de vue doit gérer le multi-ligne, de toutes tailles de polices, de gérer la hauteur et pas seulement la largeur, ... Malheureusement, aucun de ces échantillons que j'ai trouvé a bien fonctionné.
ok, certainement pas une solution complète. désolé. Pas le temps de l'améliorer pour le moment.. Si vous pouvez l'améliorer, n'hésitez pas à poster votre solution.
J'ai créé un nouveau thread qui affiche mes tests, en espérant que quelqu'un serait en mesure de faire une bonne solution : stackoverflow.com/questions/16017165/...
OriginalL'auteur Pascal
J'ai eu le même problème et a écrit une classe qui semble fonctionner pour moi. En gros, j'ai utilisé un statique de la mise en page de dessiner le texte dans une autre toile et réévaluer en attendant que je trouve une taille de police qui vous convient. Vous pouvez voir la classe posté dans le sujet ci-dessous. J'espère que cela aide.
Mise à l'Échelle Auto TextView Texte à l'intérieur de Limites
OriginalL'auteur Chase
Légère modification à onMeasure:
Et la recherche binaire sur refitText:
trySize *= availableWidth / measured_width
(puis serré à minTextSize).OriginalL'auteur gjpc
J'ai trouvé le suivant fonctionne bien pour moi. Il ne tourne pas en boucle, et représente à la fois la hauteur et la largeur. Notez qu'il est important de spécifier l'unité PX lors de l'appel de setTextSize sur la vue. Grâce à la pointe dans un post précédent de ce!
Voici la routine que j'utilise, en passant dans le getPaint() de la vue. 10 chaîne de caractère avec un grand caractère est utilisé pour estimer la largeur indépendant de la chaîne réelle.
Ce code est utile pour placer du texte dans une vue existante dans une contrainte de taille de la zone ou vous pouvez créer votre propre classe dérivée de TextView et remplacer le onMeasure comme indiqué dans d'autres posts. Par lui-même, il ne peut pas être utilisé dans une mise en page.
Assurez-vous que vous vérifiez le point de vue des dimensions de la après elle a été tirée. Cette opération pendant onCreate() est trop tôt. J'ai utilisé ViewTreeObserver à assurez-vous que les mesures ont été prises au bon moment.
OriginalL'auteur Glenn
Vous pouvez désormais le faire sans qu'un tiers de la bibliothèque ou un widget. Il est intégré dans TextView de l'API de niveau 26. Ajouter
android:autoSizeTextType="uniform"
à votreTextView
et régler la hauteur. C'est tout.https://developer.android.com/guide/topics/ui/look-and-feel/autosizing-textview.html
Vous pouvez également utiliser
TextViewCompat
pour la compatibilité.OriginalL'auteur arsent
Fonctionne avec modification
Vous devez configurer l'affichage du texte de la taille comme ça parce que sinon setTextSize suppose que la valeur est dans les SP unités:
Et vous avez besoin d'ajouter explicitement ce code.
OriginalL'auteur gregm
Utilisation
app:autoSizeTextType="uniform"
pour la compatibilité descendante, carandroid:autoSizeTextType="uniform"
seulement le travail de l'API de Niveau 26 et plus.OriginalL'auteur Suraj Vaishnav
J'ai utilisé une variante de Dunni solution ci-dessus, mais ce code ne fonctionne pas pour moi. En particulier, lors de l'utilisation de la Peinture à l'objet défini à avoir les traits de la vue de la Peinture de l'objet, puis en appelant à savoir measuretext(), il ne renvoie pas la même valeur qu'en appelant directement le point de vue de la Peinture de l'objet. Peut-être il y a quelques différences dans la façon de mon point de vue sont mis en place qui rendent le comportement différent.
Ma solution a été d'utiliser directement le point de vue de la Peinture, même si il peut y avoir des pénalités en changeant la taille de la police pour la vue plusieurs fois.
OriginalL'auteur ThomasW
J'ai travaillé sur l'amélioration de l'excellente solution de speedplane, et est venu avec cette. Il gère la hauteur, y compris le réglage de la marge, tels que le texte doit être correctement centré verticalement.
Il utilise la même fonction pour obtenir la largeur, comme il semble le meilleur travail, mais il utilise une fonction différente pour obtenir la hauteur, la hauteur n'est pas n'importe où. Il y a quelques corrections à faire, mais j'ai trouvé une façon de le faire, tout en regardant agréable à l'œil.
OriginalL'auteur PearsonArtPhoto
Google déjà fait cette fonctionnalité.
https://developer.android.com/guide/topics/ui/look-and-feel/autosizing-textview.html
OriginalL'auteur tse
Inspiré par le précédent affiches, je voulais partager ma solution. Il fonctionne avec un facteur d'échelle appliqué à la précédente taille de la police pour le faire rentrer dans l'espace disponible. En plus de prévenir le comportement inattendu de TextViews méthode onDraw, il dessine simplement le texte sur son propre.
OriginalL'auteur unSinn
OriginalL'auteur Dhwanik Gandhi
Cela devrait être une solution simple:
OriginalL'auteur Hamzeh Soboh
Étendre TextView et remplacer onDraw avec le code ci-dessous. Il permettra de conserver le texte de l'aspect ratio, mais la taille de remplir l'espace. Vous pouvez facilement modifier le code pour étirer si nécessaire.
OriginalL'auteur Greg Bacchus
J'ai écrit une classe helper qui fait un textview s'inscrivent dans une certaine largeur et ajoute ellipsize "..." à la fin si le minimum textsize ne peut pas être atteint.
Garder à l'esprit qu'il ne fait que la taille du texte jusqu'à ce qu'il convient ou jusqu'à ce que le minimum de la taille du texte est atteint. Pour tester avec de grandes tailles, définir la textsize à un grand nombre avant l'appel à l'aide de la méthode.
Il faut Pixels, donc si vous êtes en utilisant les valeurs de dimen, vous pouvez l'appeler comme ceci:
C'est la classe que j'utilise:
OriginalL'auteur Björn Kechel
Si une traduction comme allCaps est définie, speedplane l'approche de buggy. Je le fixe, entraînant dans le code suivant (désolé, ma réputation ne me permet pas d'ajouter un commentaire à speedplane de la solution):
OriginalL'auteur dpoetzsch
Je n'ai pas connu ce qui est correct ou non bt son travail ...prenez votre vue et de vérifier OnGlobalLayoutListener() et obtenir textview linecount puis définissez textSize.
Elle est très simple quelques ligne de code..
OriginalL'auteur Mathan Chinna
J'ai eu cette douleur dans mes projets pour tellement longtemps jusqu'à ce que j'ai trouvé cette bibliothèque:
Vous suffit d'ajouter le code xml à vos besoins et c'est fait. Par exemple:
OriginalL'auteur Giedrius Šlikas