Подтвердить что ты не робот

Как узнать, был ли мой текст эллипсисом?

У меня есть многострочный TextView, который имеет android:ellipsize="end". Я хотел бы знать, однако, если строка, которую я размещаю там, на самом деле слишком длинная (чтобы я мог убедиться, что полная строка показана в другом месте на странице).

Я мог бы использовать TextView.length() и найти то, что приблизительная длина строки будет соответствовать, но так как это несколько строк, TextView обрабатывает, когда обертывать, поэтому это не всегда будет работать.

Любые идеи?

4b9b3361

Ответ 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)

Это типичный случай:

  1. комментарий в "reviewTextView"
  2. комментарий может быть свернут по некоторым критериям
  3. если комментарий свернулся, вы показываете кнопку "readMoreButton"

Ответ 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() не может вызывать перед установкой вида (макета).