2010-08-04 5 views
12

J'ai une mise en page qui ressemble à ceci:Comment puis-je déterminer la taille du texte dans un TextView sous Android?

[TextView 1] [TextView 2] 
[ TextView 2 spill-over ] 

Essentiellement, j'ai besoin le contenu de TextView 2 pour envelopper à la ligne suivante, mais où commencer TextView 1 commence. Je pensais que si je savais combien de texte entrerait dans TextView 2 avant qu'il ne manque d'espace sur la première ligne, je pourrais prendre le reste du texte et le mettre dans un autre TextView sous les deux premiers. J'ai donc besoin de mesurer la quantité de texte qui va entrer dans un TextView (ce qui peut être compliqué car, pour autant que je sache, Android va essayer de casser le texte dans un TextView à un bon endroit pour qu'il ne casse pas un mot au milieu si cela peut être évité) ou j'ai besoin d'une nouvelle idée sur la façon de le dire.

Toute aide serait grandement appréciée.

Merci à l'avance,

groomsy

+0

Si cela est possible, j'ai le sentiment qu'il sera beaucoup plus compliqué que cela en vaut la peine. Pourquoi ne pouvez-vous pas simplement ajouter le texte de votre TextView2 à textview 1? – Falmarri

+1

Différents formats. De plus, TextView 1 peut parfois être un ImageView. J'ai pensé à tout mettre dans un WebView, mais je ne sais pas comment je m'arrêterais à 2 lignes. – groomsy

+0

http://stackoverflow.com/questions/7259016/scale-text-in-a-view-to-fit/7259136#7259136 – Ronnie

Répondre

9

Malheureusement, Paint.breakText n'a pas renvoyé exactement le même résultat que dans a été vu dans mon TextView à deux lignes.

Cependant, cela a fonctionné

int numChars = textView.getLayout().getLineEnd(1); 

(utilisation NumberOfLines - 1 comme paramètre à elle)

Ref http://developer.android.com/reference/android/text/Layout.html#getLineEnd(int) Set individual lines of TextView to different width

+0

Cela m'a fait aller dans le bon chemin avec un problème connexe. Une combinaison de 'getLineCount' et de' getLineStart' a fait l'affaire pour moi quand on a coupé/"ellipsé" un TextView. – loeschg

+0

En outre, pour toute personne ayant un problème avec 'getLayout()' retournant null, vérifiez cette question. http://stackoverflow.com/questions/19157650/how-to-get-height-of-view-inside-adapter-for-creating-sized-bitmap – loeschg

+0

@Ioeschg 'getlayout()' retourne 'null', mais le ci-dessus lien donné n'est pas utile. Pouvez-vous dire ce qui ne va pas? – Ammar

6

Vous pouvez créer un objet de la peinture avec la taille du texte de TextView2 et utiliser breakText() pour mesurer le nombre de caractères adaptée à votre largeur de TextView2.

(Ce code non testé est - peut-être besoin de légères modifications)

String textToBeSplit = arbitraryText; // Text you want to split between TextViews 
float textView2Width = somehowGetItsWidth; // TextView2's width 
float myTextSize = textView2.getTextSize(); 

Paint paint = new Paint(); 
paint.setTextSize(myTextSize); // Your text size 
int numChars = paint.breakText(textToBeSplit, true, float textView2Width, null); 

numChars vous indique combien de caractères textToBeSplit se tenir dans la largeur de TextView2, vous permettant de le diviser entre votre point de vue.

+0

Merci pour l'exemple. Je vais travailler dessus et vous laisser savoir comment cela se passe. – groomsy

+0

ne fonctionne pas pour moi. Toujours retourner zéro – shantanu

+1

Essayé cela et cela a presque fonctionné. Le problème était que le TextView utilise une approche légèrement différente, surtout quand il a plus d'une ligne. Le compte serait 2-3 caractères de. Trouvé une meilleure solution que je posterai comme une réponse – dparnas

2

Vous n'avez pas besoin de deux TextViews afin de faire Pour cela, vous devez toujours utiliser le moins de vues possible et vous pouvez utiliser une image pour avoir deux styles pour la même vue de texte.
Par exemple avec:

TextView tv = (TextView) findViewById(R.id.textview); 
SpannableString text = new SpannableString(myString); 

text.setSpan(new TextAppearanceSpan(getContext(), R.style.myStyle), 0, 5, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
text.setSpan(new TextAppearanceSpan(getContext(), R.style.myNextStyle), 6, 10, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 

tv.setText(text, TextView.BufferType.SPANNABLE); 
Questions connexes