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


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

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

какие идеи?

10 60

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