web-dev-qa-db-fra.com

Comment savoir si mon textview a été ellipsisé?

J'ai une TextView à plusieurs lignes qui a Android:ellipsize="end" défini. Je voudrais toutefois savoir si la chaîne que je place est trop longue (pour pouvoir vérifier que la chaîne complète est affichée ailleurs sur la page).

Je pourrais utiliser TextView.length() pour savoir à quoi correspondra la longueur approximative de la chaîne, mais comme il s'agit de plusieurs lignes, la variable TextView définit le moment où le retour à la ligne est terminé, ainsi cela ne fonctionnera pas toujours.

Des idées?

62
FrederickCook

Vous pouvez obtenir la mise en page de la variable TextView et vérifier le nombre d’ellipses par ligne. Pour terminer Ellipsis, il suffit de vérifier la dernière ligne, comme ceci:

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");
}

Cela ne fonctionne qu'après la phase de présentation, sinon la présentation renvoyée sera null, appelez-la à un endroit approprié de votre code.

108
Thorstenvv

textView.getLayout est la solution, mais le problème est qu’elle renvoie la valeur null si la présentation n’est pas préparée. Utilisez la solution ci-dessous.

 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");
           }  
        }
    });
27
Himanshu Virmani

Je pense que la solution la plus simple à cette question est le code suivant:

String text = "some looooong text";
textView.setText(text);
boolean isEllipsize = !((textView.getLayout().getText().toString()).equalsIgnoreCase(text));

Ce code suppose que dans votre XML le TextView définit une maxLineCount :)

15
Francesco Florio

public int getEllipsisCount (int line) :

Renvoie le nombre de caractères à supprimer, ou 0 si aucun Ellipsis ne doit avoir lieu.

Alors, appelez simplement:

int lineCount = textview1.getLineCount();

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

Puisque getLayout () ne peut pas être appelé avant que la disposition ne 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 de supprimer removeOnGlobalLayoutListener lorsque vous en avez besoin nomore.

3
amalBit

Cela a fonctionné pour moi:

textView.post(new Runnable() {
                        @Override
                        public void run() {
                            if (textView.getLineCount() > 1) {
                                //do something
                            }
                        }
                    });
2
Cícero Moura

J'ai créé un TextView personnalisé avec une notification d'écoute pour ce problème même. Il corrige également le problème d'ellipse multiligne. Vous pouvez le trouver sur Android ellipsize multiline textview

2
Micah Hainline

Ça marche pour moi

if (l != null) {
    int lines = l.getLineCount();
     if (lines > 0) {
     for (int i = 0; i < lines; i++) {
     if (l.getEllipsisCount(i) > 0) {
      ellipsize = true;
      break;
     }
    }
   }
  }
1
coffee
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. le commentaire peut être réduit selon certains critères
  3. si le commentaire est réduit, vous affichez le bouton 'readMoreButton'
1
A.Y.

Travaillez vraiment, par exemple, pour transmettre des données complètes à une boîte de dialogue à partir d’un élément de RecyclerView:

holder.subInfo.post(new Runnable() {
                @Override
                public void run() {
                    Layout l = holder.subInfo.getLayout();
                    if (l != null) {
                        final int count = l.getLineCount();
                        if (count >= 3) {
                            holder.subInfo.setOnClickListener(new View.OnClickListener() {
                                @Override
                                public void onClick(View view) {
                                    final int c = holder.subInfo.getLineCount();
                                    if (c >= 3) {
                                        onClickToShowInfoDialog.showDialog(holder.title.getText().toString(), holder.subInfo.getText().toString());
                                    }
                                }
                            });
                        }
                    }
                }
            });
0