Изменение textView на более короткий текст динамически вместо многоточия

У меня есть такой код:

  final ViewTreeObserver[] viewTreeObserver = {myAcco    
    viewTreeObserver[0].addOnPreDrawListener(
        new OnPreDrawListener() {
          @Override
          public boolean onPreDraw() {
            int chipWidth =
                myAccountView.getMeasuredWidth()
                    - myAccountView.getPaddingLeft()
                    - myAccountView.getPaddingRight();
            if (chipWidth > 0) {
              myAccountView.setText(
                  setChipTextWithCorrectLength(
                      getContext().getString(R.string.og_my_account_desc_long_length),
                      getContext().getString(R.string.og_my_account_desc_meduim_length),
                      getContext().getString(R.string.og_my_account_desc_short_length),
                      chipWidth));
              viewTreeObserver[0] = myAccountView.getViewTreeObserver();
              if (viewTreeObserver[0].isAlive()) {
                viewTreeObserver[0].removeOnPreDrawListener(this);
              }
            }
            return true;
          }
        });
  }

  @VisibleForTesting
  String setChipTextWithCorrectLength(
      String longDesc, String mediumDesc, String shortDesc, int clipWidth) {
    if (!isTextEllipsized(longDesc, clipWidth)) {
      return longDesc;
    }
    if (!isTextEllipsized(mediumDesc, clipWidth)) {
      return mediumDesc;
    }
    return shortDesc;
  }

  private boolean isTextEllipsized(String text, int clipWidth) {
    TextPaint textPaint = myAccountView.getPaint();

    Toast.makeText(this.getContext(), "textPaint.measureText(text) = "+textPaint.measureText(text)+" clipWidth  = "+ clipWidth,
        Toast.LENGTH_LONG).show();


    return textPaint.measureText(text) > clipWidth;
  }

Код должен динамически изменять текст в textView, когда требуется многоточие.

Однако, когда я запускаю приложение, я иногда вижу ширину представления (клипа) ==, ширину длинного текста, и в пользовательском интерфейсе все еще присутствует многоточие.

Я вижу, что это происходит, когда textView - это not visible и переключается на visible.

Стоит ли рассчитывать ширину vlip (view) по-другому?

Какой-нибудь особый способ измерить textView до того, как станет visible?

Метод requestLayout должен рассчитывать положение и размеры обзора. Вы пробовали?

Ircover 21.09.2018 08:47
5
1
328
2

Ответы 2

Вы должны проверить с

getEllipsisCount()

чтобы увидеть источник проблемы.

Определение: возвращает количество символов, которые нужно удалить с помощью многоточия, или 0, если многоточие не требуется.

но я могу использовать getEllipsisCount() только на слишком поздней стадии, нет? когда это доступно? onGlobalLayout (после розыгрыша). нет?

Elad Benda 15.09.2018 23:55

Разве вы не можете использовать это, чтобы определить, почему иногда это не работает?

kelalaka 16.09.2018 00:14

Здесь stackoverflow.com/questions/14276853/…

kelalaka 16.09.2018 00:22

проверить, работает ли вызов textView.onRtlPropertiesChanged (0) перед getEllipsisCount ()?

user6327816 22.09.2018 01:11

Да, вы можете использовать textView.getLayout().getEllipsisStart(0), убедитесь, что ваш textView однострочный, вы можете сделать это, добавив android:maxLines = "1" в свой texView. Он возвращает индекс, по которому текст усекается, иначе возвращает 0.

В зависимости от вашего наблюдения может случиться так, что представление не пересчитывается после изменения видимости снова на видимую, попробуйте использовать textView.setVisibility(View.GONE) вместо textView.setVisibility(View.INVISIBLE);. Это может вызвать повторный вызов preDraw().

Вы также можете рассмотреть возможность использования addOnGlobalLayoutListener() для отслеживания изменений видимости вашего представления для ссылка.

Другие вопросы по теме