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?
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.
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");
}
}
});
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
:)
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.
Cela a fonctionné pour moi:
textView.post(new Runnable() {
@Override
public void run() {
if (textView.getLineCount() > 1) {
//do something
}
}
});
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
Ç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;
}
}
}
}
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:
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());
}
}
});
}
}
}
});