Проверьте, является ли textview эллипсисом в android

У меня TextView с шириной как wrap content . В этом TextView я устанавливаю текст, но текст не имеет одинаковой длины каждый раз. Когда текст очень длинный, я использую одиночную строку true и ellipsize : end. Но теперь у меня проблема. Я хочу установить видимость другого макета, но это зависит от длины моего текста. Если текст слишком длинный, чтобы поместиться на экране, я хочу установить значениеVisible true, но когда текст короткий и когда мне не нужен эллипсис, я хочу установить видимость false. Поэтому мне нужно проверить статус моего TextView. Когда его эллипсис я хочу установитьVisible true, когда его не setVisible false. Как я могу это сделать. Это то, что я получил:

 tvAle.post(new Runnable() { @Override public void run() { int lineCount = tvAle.getLineCount(); Paint paint = new Paint(); paint.setTextSize(tvAle.getTextSize()); final float size = paint.measureText(tvAle.getText().toString()); Log.v("a", ""+size+" "+tvAle.getWidth()); if ((int)size > (tvAle.getWidth()+10)) { allergiesLayout.setVisibility(View.VISIBLE); } else allergiesLayout.setVisibility(View.GONE); } 

Но это решение не работает.

Вы можете использовать этот метод: getEllipsisCount

 Layout layout = textview1.getLayout(); if(layout != null) { int lines = layout.getLineCount(); if(lines > 0) { int ellipsisCount = layout.getEllipsisCount(lines-1); if ( ellipsisCount > 0) { Log.d(TAG, "Text is ellipsized"); } } } 

Где строка может быть получена через getLineCount ()

Ну, принятое решение действительно работает, но пропускает несколько угловых случаев, потому что он будет проверять только последнюю строку для эллипсированных символов. Если у меня есть TextView, состоящий из двух строк, и используйте TruncateAt.START для усечения текста в его начале, принятый ответ завершится неудачно. : – /

Добавление ViewTreeObserver.OnPreDrawListener кажется скорее дорогим накладным для меня. Поэтому я сделал следующие улучшения в коде принятого ответа:

 /** * Checks if the text of the supplied {@link TextView} has been ellipsized. * * @param textView * The {@link TextView} to check its text. * * @return {@code True} if the text of the supplied {@code textView} has been ellipsized. */ public static boolean isTextViewEllipsized(final TextView textView) { // Initialize the resulting variable boolean result = false; // Check if the supplied TextView is not null if (textView != null) { // Check if ellipsizing the text is enabled final TextUtils.TruncateAt truncateAt = textView.getEllipsize(); if (truncateAt != null && !TextUtils.TruncateAt.MARQUEE.equals(truncateAt)) { // Retrieve the layout in which the text is rendered final Layout layout = textView.getLayout(); if (layout != null) { // Iterate all lines to search for ellipsized text for (int index = 0; index < layout.getLineCount(); ++index) { // Check if characters have been ellipsized away within this line of text result = layout.getEllipsisCount(index) > 0; // Stop looping if the ellipsis character has been found if (result) { break; } } } } } return result; } 

Тем не менее, все еще есть возможности для улучшения. Но этот метод достаточно для моих вариантов использования. Коррекции и улучшения ценятся. 🙂

Использование 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. Затем вы можете проверить строку в своем коде, и если она больше определенного числа, вы можете вернуть false, чтобы отменить рисование TextView и установить счетчик строк, а также флаг, чтобы сохранить слишком длинный текст или не. Текстовое изображение снова будет рисоваться с правильным количеством строк, и вы узнаете, его эллипсис или нет с флагом.

Затем вы можете использовать флаг isEllipsized для выполнения всех необходимых действий.