Как я могу сказать, если мой textview был эллипсисом?
у меня есть многострочный TextView
и android:ellipsize="end"
set. Я хотел бы знать, однако, если строка, которую я помещаю туда, на самом деле слишком длинная (чтобы я мог убедиться, что полная строка показана в другом месте на странице).
Я мог бы использовать TextView.length()
и найти о том, что приблизительная длина строки будет соответствовать, но так как это несколько строк,TextView
ручки для того чтобы обернуть, так что это не всегда работает.
какие идеи?
10 ответов:
вы можете получить макет
TextView
и проверьте количество многоточий в строке. Для многоточия конца достаточно проверить последнюю строку, например: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"); }
это работает только после этапа компоновки, в противном случае возвращаемый макет будет равен нулю, поэтому вызовите его в соответствующем месте вашего кода.
textView.getLayout-это путь, но проблема в том, что он возвращает null, если макет не подготовлен. Используйте следующее решение.
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"); } } });
Я думаю, что самым простым решением этого вопроса является следующий код:
String text = "some looooong text"; textView.setText(text); boolean isEllipsize = !((textView.getLayout().getText().toString()).equalsIgnoreCase(text));
этот код предполагает, что в вашем XML TextView установлен a
maxLineCount
:)
public int getEllipsisCount (int line):
возвращает количество символов, которые должны быть эллипсисом, или 0, если эллипсис не должен иметь место.
так, просто звоните :
int lineCount = textview1.getLineCount(); if(textview1.getLayout().getEllipsisCount(lineCount) > 0) { // Do anything here.. }
поскольку getLayout () не может быть вызван до установки макета, используйте это:
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"); } } });
и, наконец, не забудьте удалить removeOnGlobalLayoutListener когда вам это нужно исчезнуть.
Я создал пользовательский TextView с уведомлением слушателя для этой самой проблемы. Он также исправляет проблему многострочного эллипса. Вы можете найти его по адресу android ellipsize multiline textview
это работает для меня
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; } } } }
действительно работают так, например, чтобы передать полные данные в диалог из элемента 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()); } } }); } } } });
это сработало для меня:
textView.post(new Runnable() { @Override public void run() { if (textView.getLineCount() > 1) { //do something } } });
используя
getEllipsisCount
не будет работать с текстом, который имеет пустые строки внутри него. Я использовал следующий код, чтобы заставить его работать: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; } });
убедитесь, что не поставил
maxLineCount
в XML. Тогда вы можете проверить дляlineCount
в вашем коде и если он больше определенного числа, вы можете вернуть false, чтобы отменить рисованиеTextView
и установите счетчик строк, а также флаг, чтобы сохранить, является ли текстовое представление слишком длинным или нет. Текстовый вид будет рисовать снова с правильным количеством строк и вы будете знать, является ли его эллипс или нет с флагом.затем вы можете использовать
isEllipsized
флаг, чтобы сделать все, что вам нужно.
создать метод внутри вашего TextViewUtils класс
public static boolean isEllipsized(String newValue, String oldValue) { return !((newValue).equals(oldValue)); }
вызвать этот метод, когда это необходимо, например:
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
но textView.getLayout() не удается вызвать перед набором вид (макет).