Как узнать, был ли мой текст эллипсисом?
У меня есть многострочный TextView
, который имеет android:ellipsize="end"
. Я хотел бы знать, однако, если строка, которую я размещаю там, на самом деле слишком длинная (чтобы я мог убедиться, что полная строка показана в другом месте на странице).
Я мог бы использовать TextView.length()
и найти то, что приблизительная длина строки будет соответствовать, но так как это несколько строк, TextView
обрабатывает, когда обертывать, поэтому это не всегда будет работать.
Любые идеи?
Ответы
Ответ 1
Вы можете получить макет 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");
}
Это работает только после фазы макета, иначе возвращаемый макет будет нулевым, поэтому вызовите это в соответствующем месте в вашем коде.
Ответ 2
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");
}
}
});
Ответ 3
Я думаю, что самым простым решением этого вопроса является следующий код:
String text = "some looooong text";
textView.setText(text);
boolean isEllipsize = !((textView.getLayout().getText().toString()).equalsIgnoreCase(text));
Этот код предполагает, что в вашем XML TextView установлен a maxLineCount
:)
Ответ 4
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, когда вам это нужно.
Ответ 5
Это сработало для меня:
textView.post(new Runnable() {
@Override
public void run() {
if (textView.getLineCount() > 1) {
//do something
}
}
});
Ответ 6
lateinit var toggleMoreButton: Runnable
toggleMoreButton = Runnable {
if(reviewTextView.layout == null) { // wait while layout become available
reviewTextView.post(toggleMoreButton)
[email protected]
}
readMoreButton.visibility = if(reviewTextView.layout.text.toString() != comment) View.VISIBLE else View.GONE
}
reviewTextView.post(toggleMoreButton)
Это типичный случай:
- комментарий в "reviewTextView"
- комментарий может быть свернут по некоторым критериям
- если комментарий свернулся, вы показываете кнопку "readMoreButton"
Ответ 7
Я создал пользовательский TextView с уведомлением слушателя для этой самой проблемы. Он также устраняет проблему многострочного эллипса. Вы можете найти его в многострочном текстовом виде android эллипсирования
Ответ 8
он работает для меня
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;
}
}
}
}
Ответ 9
Действительно работают так, например, чтобы передать полные данные в диалог из элемента 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());
}
}
});
}
}
}
});
Ответ 10
Путь Котлина:
textView.post {
if (textView.lineCount > MAX_LINES_COLLAPSED) {
// text is not fully displayed
}
}
На самом деле View.post()
выполняется после визуализации представления и запускает предоставленную функцию
Ответ 11
Использование 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
для выполнения всех необходимых действий.
Ответ 12
создайте метод внутри класса 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() не может вызывать перед установкой вида (макета).