У меня есть такой код:
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
?
Вы должны проверить с
getEllipsisCount()
чтобы увидеть источник проблемы.
Определение: возвращает количество символов, которые нужно удалить с помощью многоточия, или 0, если многоточие не требуется.
но я могу использовать getEllipsisCount()
только на слишком поздней стадии, нет? когда это доступно? onGlobalLayout (после розыгрыша). нет?
Разве вы не можете использовать это, чтобы определить, почему иногда это не работает?
Здесь stackoverflow.com/questions/14276853/…
проверить, работает ли вызов textView.onRtlPropertiesChanged (0) перед getEllipsisCount ()?
Да, вы можете использовать textView.getLayout().getEllipsisStart(0)
, убедитесь, что ваш textView однострочный, вы можете сделать это, добавив android:maxLines = "1"
в свой texView. Он возвращает индекс, по которому текст усекается, иначе возвращает 0.
В зависимости от вашего наблюдения может случиться так, что представление не пересчитывается после изменения видимости снова на видимую, попробуйте использовать textView.setVisibility(View.GONE)
вместо textView.setVisibility(View.INVISIBLE);
. Это может вызвать повторный вызов preDraw()
.
Вы также можете рассмотреть возможность использования addOnGlobalLayoutListener()
для отслеживания изменений видимости вашего представления для ссылка.
Метод
requestLayout
должен рассчитывать положение и размеры обзора. Вы пробовали?