93 votes

Comment puis-je savoir si ma fenêtre de texte a été elliptisée ?

Je dispose d'une ligne TextView qui a android:ellipsize="end" set. J'aimerais cependant savoir si la chaîne de caractères que j'y place est effectivement trop longue (afin de m'assurer que la chaîne complète est affichée ailleurs sur la page).

Je pourrais utiliser TextView.length() et trouver la longueur approximative de la ficelle qui rentrera, mais comme il s'agit de plusieurs lignes, la TextView gère le moment de l'emballage, donc cela ne fonctionnera pas toujours.

Des idées ?

6voto

amalBit Points 3406

public int getEllipsisCount (int ligne) :

Renvoie le nombre de caractères à éliminer par ellipse, ou 0 si aucune ellipse ne doit avoir lieu.

Il suffit donc d'appeler :

int lineCount = textview1.getLineCount();

if(textview1.getLayout().getEllipsisCount(lineCount) > 0) {
   // Do anything here..
}

Puisque getLayout() ne peut pas être appelé avant que la mise en page soit définie, utilisez ceci :

ViewTreeObserver vto = textview.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
       Layout l = textview.getLayout();
       if ( l != null){
          int lines = l.getLineCount();
          if ( lines > 0)
              if ( l.getEllipsisCount(lines-1) > 0)
                Log.d(TAG, "Text is ellipsized");
       }  
    }
});

Et enfin, n'oubliez pas d'enlever removeOnGlobalLayoutListener quand vous en avez besoin.

3voto

A.Y. Points 71
lateinit var toggleMoreButton: Runnable
toggleMoreButton = Runnable {
  if(reviewTextView.layout == null) { // wait while layout become available
       reviewTextView.post(toggleMoreButton) 
       return@Runnable
  }
  readMoreButton.visibility = if(reviewTextView.layout.text.toString() != comment) View.VISIBLE else View.GONE
}
reviewTextView.post(toggleMoreButton)

C'est un cas typique :

  1. commentaire dans "reviewTextView
  2. les commentaires peuvent être classés selon certains critères
  3. si le commentaire est réduit, vous affichez le bouton "readMoreButton".

2voto

4ndro1d Points 1154

La méthode Kotlin :

textView.post {
   if (textView.lineCount > MAX_LINES_COLLAPSED) {
   // text is not fully displayed
   }
}

En fait, View.post() est exécuté après que la vue a été rendue et exécute la fonction fournie.

2voto

Chaseos Points 21

Méthode simple en Kotlin. Permet à android:ellipsize y android:maxLines à utiliser

fun isEllipsized(textView: TextView, text: String?) = textView.layout.text.toString() != text

2voto

Serjant.arbuz Points 31

Solution avec les extensions kotlin :

infoText.afterLayoutConfiguration {
    val hasEllipsize = infoText.hasEllipsize()
    ...
}

Extensions :

/**
 * Function for detect when layout completely configure.
 */
fun View.afterLayoutConfiguration(func: () -> Unit) {
    viewTreeObserver?.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {
        override fun onGlobalLayout() {
            viewTreeObserver?.removeOnGlobalLayoutListener(this)
            func()
        }
    })
}

fun TextView.hasEllipsize(): Boolean = layout.getEllipsisCount(lineCount - 1) > 0

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X