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