Как я могу узнать, было ли мое текстовое представление эллиптическим? - PullRequest
67 голосов
/ 24 октября 2010

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

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

Есть идеи?

Ответы [ 11 ]

112 голосов
/ 24 октября 2010

Вы можете получить макет 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");
}

Это работает только после фазы макета, в противном случае возвращаемый макет будет нулевым, поэтому вызовите его в соответствующем месте вваш код.

31 голосов
/ 08 октября 2013

textView.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");
           }  
        }
    });
20 голосов
/ 06 ноября 2015

Я думаю, что самым простым решением этого вопроса является следующий код:

String text = "some looooong text";
textView.setText(text);
boolean isEllipsize = !((textView.getLayout().getText().toString()).equalsIgnoreCase(text));

В этом коде предполагается, что в вашем XML для TextView установлено maxLineCount:)

4 голосов
/ 27 июля 2018

Это сработало для меня:

textView.post(new Runnable() {
                        @Override
                        public void run() {
                            if (textView.getLineCount() > 1) {
                                //do something
                            }
                        }
                    });
3 голосов
/ 22 декабря 2018
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)

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

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

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 когда вам это нужно

2 голосов
/ 20 июля 2011

Я создал собственный TextView с уведомлением слушателя об этой самой проблеме. Это также решает проблему многолинейного эллипса. Вы можете найти его в многострочном текстовом представлении для Android с многоточием

1 голос
/ 29 августа 2016

у меня работает

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;
     }
    }
   }
  }
0 голосов
/ 13 мая 2018

Действительно работает, например, для передачи полных данных в диалог из элемента 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());
                                    }
                                }
                            });
                        }
                    }
                }
            });
0 голосов
/ 28 марта 2017

создайте метод внутри вашего TextViewUtils class

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

...