Ich habe eine Mehrfachleitung TextView
, die android:ellipsize="end"
eingestellt hat. Ich würde jedoch gerne wissen, ob die Zeichenfolge, die ich dort platziere, tatsächlich zu lang ist (damit ich sicherstellen kann, dass die vollständige Zeichenfolge an anderer Stelle auf der Seite angezeigt wird).
Ich könnte verwenden TextView.length()
und herausfinden, wie die ungefähre Länge der Zeichenfolge passt, aber da es sich um mehrere Zeilen handelt, müssen die TextView
Ziehpunkte umbrochen werden, sodass dies nicht immer funktioniert.
Irgendwelche Ideen?
getEllipsisCount
Funktionsfehlers in API <= 14 schlägt dies fehl und gibt 0 zurück, wenn der Text Sonderzeichen wie '\ n' enthält. So können Sie es umgehen , indem sie die Unterstützung Bibliotheken und Ersetzenif (l.getEllipsisCount(lines-1) > 0)
mitif (l.getEllipsisCount(lines-1) > 0 || TextViewCompat.getMaxLines(this))
.textView.getLayout ist der richtige Weg, aber das Problem dabei ist, dass es null zurückgibt, wenn das Layout nicht vorbereitet ist. Verwenden Sie die folgende Lösung.
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"); } } });
Code-Snippet zum Entfernen des Listeners ( Quelle ):
mLayout.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { public void onGlobalLayout() { scrollToGridPos(getCenterPoint(), false); mLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this); } });
quelle
removeOnGlobalLayoutListener()
wenn du es nicht mehr brauchst.Layout
getEllipsisCount
Ich denke, die einfachste Lösung für diese Frage ist der folgende Code:
String text = "some looooong text"; textView.setText(text); boolean isEllipsize = !((textView.getLayout().getText().toString()).equalsIgnoreCase(text));
Dieser Code setzt voraus, dass die Textansicht in Ihrem XML ein
maxLineCount
:) gesetzt hatquelle
Das hat bei mir funktioniert:
textView.post(new Runnable() { @Override public void run() { if (textView.getLineCount() > 1) { //do something } } });
quelle
public int getEllipsisCount (int line) :
Rufen Sie einfach an:
int lineCount = textview1.getLineCount(); if(textview1.getLayout().getEllipsisCount(lineCount) > 0) { // Do anything here.. }
Da getLayout () nicht aufgerufen werden kann, bevor das Layout festgelegt wurde, verwenden Sie Folgendes:
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"); } } });
Und schließlich vergessen Sie nicht, removeOnGlobalLayoutListener zu entfernen, wenn Sie es nomore benötigen.
quelle
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)
Es ist ein typischer Fall:
quelle
Der Kotlin-Weg:
textView.post { if (textView.lineCount > MAX_LINES_COLLAPSED) { // text is not fully displayed } }
View.post()
Wird tatsächlich ausgeführt, nachdem die Ansicht gerendert wurde, und führt die bereitgestellte Funktion ausquelle
es funktioniert für mich
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; } } } }
quelle
Einfache Kotlin-Methode. Ermöglicht
android:ellipsize
undandroid:maxLines
verwendet werdenfun isEllipsized(textView: TextView, text: String?) = textView.layout.text.toString() != text
quelle
Arbeiten Sie also wirklich so, dass Sie beispielsweise vollständige Daten von RecyclerView an den Dialog übergeben:
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()); } } }); } } } });
quelle
Hier ist die Kotlin-Version, die @Thorstenvv awnser mit @Tiano fix kombiniert:
val layout = textView.layout ?: return@doOnLayout val lines = layout.lineCount val hasLine = lines > 0 val hasEllipsis = ((lines - 1) downTo 0).any { layout.getEllipsisCount(it) > 0 } if (hasLine && hasEllipsis) { // Text is ellipsized }
quelle
In Kotlin können Sie den folgenden Code verwenden.
var str= "Kotlin is one of the best languages." textView.text=str textView.post { val isEllipsize: Boolean = !textView.layout.text.toString().equals(str) if (isEllipsize) { holder.itemView.tv_viewMore.visibility = View.VISIBLE } else { holder.itemView.tv_viewMore.visibility = View.GONE } }
quelle
Die Verwendung
getEllipsisCount
funktioniert nicht mit Text, der leere Zeilen enthält. Ich habe den folgenden Code verwendet, damit es funktioniert:message.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { @Override public boolean onPreDraw() { if(m.isEllipsized == -1) { Layout l = message.getLayout(); if (message.getLineCount() > 5) { m.isEllipsized = 1; message.setMaxLines(5); return false; } else { m.isEllipsized = 0; } } return true; } });
Stellen Sie sicher, dass
maxLineCount
in Ihrem XML kein Wert festgelegt ist. Anschließend können SielineCount
in Ihrem Code nach dem suchen. Wenn dieser Wert größer als eine bestimmte Zahl ist, können Sie false zurückgeben, um das Zeichnen des Codes abzubrechen,TextView
und die Zeilenanzahl sowie ein Flag festlegen, um zu speichern, ob die Textansicht zu lang ist oder nicht . Die Textansicht wird erneut mit der richtigen Zeilenanzahl gezeichnet und Sie wissen, ob sie mit der Flagge ellipsiert ist oder nicht.Sie können dann die
isEllipsized
Flagge verwenden, um alles zu tun, was Sie benötigen.quelle
Erstellen Sie eine Methode in Ihrer TextViewUtils- Klasse
public static boolean isEllipsized(String newValue, String oldValue) { return !((newValue).equals(oldValue)); }
Rufen Sie diese Methode auf, wenn dies erforderlich ist, z.
if (TextViewUtils.isEllipsized(textviewDescription.getLayout().getText().toString(), yourModelObject.getDescription())) holder.viewMore.setVisibility(View.VISIBLE);//show view more option else holder.viewMore.setVisibility(View.GONE);//hide
aber textView.getLayout () kann nicht aufrufen , bevor der Ansicht (Layout) gesetzt.
quelle