Android multiline TextView, vérifiez si le texte correspond ou vérifie que TextView est plein

J'ai une application d'application Android qui contient un TextView multiligne. Lorsque l'écran est en orientation portrait, TextView peut afficher une longueur de texte différente lorsque vous exécutez en mode paysage. Également en cours d'exécution sur un petit écran, TextView peut afficher une longueur de texte différente lorsque vous exécutez sur un écran plus grand.

Est-ce que je peux vérifier si le texte correspond ou sera tronqué? Ou est-ce que je peux vérifier si le TextView est plein?

  • Impossible de publier des messages du serveur: Google Cloud Messaging
  • Quand la barre de progression indéterminée vient-elle à la bibliothèque de support Android
  • Comment le multi-threading fonctionne-t-il dans Android?
  • Suppression du voyant vert de ToggleButton Android
  • Android - Supprimez la bannière supérieure dans une nouvelle application?
  • WebView wrap-content
  • Le problème est que TextView peut contenir un nombre différent de lignes, selon qu'il s'agisse de paysage, de portrait, de petit écran, de grand écran, etc.

    Merci pour votre conseil,

    Meilleures salutations,

    James

  • GCM envoie une image au lieu du message
  • WebView dans une boîte de dialogue (chargement des actifs) et non présentée
  • Alternative à getRunningTasks dans Android L
  • Design de matériaux Transparent ActionBar
  • Modifier la couleur du texte de l'élément sélectionné dans le spinner
  • Manipulation InterruptedException en attendant un signal de sortie (bug dans Android?)
  • 4 Solutions collect form web for “Android multiline TextView, vérifiez si le texte correspond ou vérifie que TextView est plein”

    Ces réponses ne fonctionnaient pas très bien pour moi. Voici ce que j'ai fini par faire

    Paint measurePaint = new Paint(myTextView.getPaint()); float pWidth = measurePaint.measureText("This is my big long line of text. Will it fit in here?"); float labelWidth = myTextView.getWidth(); int maxLines = myTextView.getMaxLines(); while (labelWidth > 0 && pWidth/maxLines > labelWidth-20) { float textSize = measurePaint.getTextSize(); measurePaint.setTextSize(textSize-1); pWidth = measurePaint.measureText("This is my big long line of text. Will it fit in here?"); if (textSize < TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_SP, 7, getContext().getResources().getDisplayMetrics())) break; } myTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, measurePaint.getTextSize()); 

    Je ne dis pas que cela va fonctionner pour chaque situation, car je suis certainement en train de couper les angles ici, mais l'idée générale est de mesurer le texte avec la peinture du texte et de continuer à le réduire jusqu'à ce qu'il corresponde à la vision du texte.

    J'ai trouvé une solution "effrontée" au problème de mesurer la hauteur du texte dans un MULTILINE TextView :

     //Calculate the height of the text in the MULTILINE TextView int textHeight = textView.getLineCount() * textView.getLineHeight(); if (textHeight > textViewHeight) { //Text is truncated because text height is taller than TextView height } else { //Text not truncated because text height not taller than TextView height } 

    Cependant, cette solution présente des réserves:

    Tout d'abord en ce qui concerne getLineHeight (), le marquage dans le texte peut entraîner des lignes plus grandes ou plus courtes que cette hauteur, et la mise en page peut contenir un remplissage supplémentaire de première ou dernière ligne. Voir http://developer.android.com/reference/android/widget/TextView.html#getLineHeight ()

    Deuxièmement, l'application doit calculer la hauteur réelle du TextView en pixels et (dans le cas de ma mise en page), il peut ne pas être aussi simple que textView.getHeight () et le calcul peut varier d'une mise en page à une autre mise en page.

    Je recommande d' éviter LinearLayout car la hauteur de pixel réelle du TextView peut varier en fonction du contenu du texte. J'utilise RelativeLayout (voir http://pastebin.com/KPzw5LYd ).

    À l'aide de RelativeLayout, je peux calculer ma hauteur TextView comme suit:

     //Calculate the height of the TextView for layout "http://pastebin.com/KPzw5LYd" int textViewHeight = layout1.getHeight() - button1.getHeight() - button2.getHeight(); 

    J'espère que cela pourra aider,

    Cordialement,

    James

    Fondamentalement, vous devez calculer la taille de votre vision du texte et la taille de votre texte lorsque le mode d'orientation a changé. Essayez ViewTreeObserver.OnGlobalLayoutListener pour le faire.

    À l'intérieur de la méthode d'orientation du changement:

     main_view.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { main_view.getViewTreeObserver().removeGlobalOnLayoutListener(this); //Calculation goes here int text_size = getTextSize(text_view.getText().toString()); int text_view_size = text_view.getLayoutParams().width; //Compare your text_size and text_view_size and do whatever you want here. } }); 

    Voici le code de calcul de text_size:

     private int getTextSize(String your_text){ Paint p = new Paint(); //Calculate the text size in pixel return p.measureText(your_text); } 

    J'espère que cette aide.

    Pour vérifier si une TextView multiligne (ou non) va être tronquée, vérifiez cette publication .

    Ou, avez-vous envisagé d'utiliser une vision de texte à défilement? (Marquee) … où le texte se déplacera par (horizontalement, animé) s'il est trop long pour une largeur donnée?

    Voici un exemple de TextView dans un fichier de mise en page, qui présente certaines de ces caractéristiques:

     <TextView android:id="@+id/sometextview" android:layout_width="wrap_content" android:layout_height="wrap_content" android:ellipsize="marquee" android:marqueeRepeatLimit="marquee_forever" android:singleLine="true" android:scrollHorizontally="true" android:focusable="true" android:focusableInTouchMode="true" android:freezesText="true" android:textColor="#808080" android:textSize="14sp" android:text="This is a long scrolling line of text.. (etc)"/> 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.