我有此代码:
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;
}
当需要使用ellipsize时,代码应动态更改textView中的文本。
但是,当我运行应用程序时,有时会看到视图(剪辑)宽度==
长的文本宽度,并且UI中仍然存在椭圆大小。
我看到当textView为not visible
并切换为visible
时会发生这种情况。
我应该以不同的方式计算vlip(视图)宽度吗?
有没有什么特殊的方法可以测量textView成为visible
?
答案 0 :(得分:0)
您应使用
进行检查getEllipsisCount()
查看问题的根源。
定义:返回要省略的字符数,如果没有省略号,则返回0。
答案 1 :(得分:0)
是的,您可以使用textView.getLayout().getEllipsisStart(0)
,确保textView是单行的,可以通过将android:maxLines="1"
添加到texView中来实现。它返回截断文本的索引,否则返回0。
根据您的观察,可能是在将可见性再次更改为“可见”后,视图未重新计算,请尝试使用textView.setVisibility(View.GONE)
而不是textView.setVisibility(View.INVISIBLE);
。这可能会导致preDraw()
再次被呼叫。
对于reference,您可能还考虑使用addOnGlobalLayoutListener()
来跟踪视图的可见性变化。