我的TextView
宽度为wrap content
。在此TextView
我设置了文本,但文本每次都不是相同的长度。当文本很长时,我使用单行true和ellipsize
:end。但现在我有一个问题。我想设置其他布局的可见性,但这取决于我的文本的长度。如果文本太长而无法放入屏幕我想setVisible为true,但是当文本很短并且我不需要ellipsize时,我想将可见性设置为false。所以我需要检查TextView的状态。当它的ellipsize我想setVisible
为真,当它不是setVisible
时。我怎么能这样做
这就是我得到的:
tvAle.post(new Runnable() {
@Override
public void run() {
int lineCount = tvAle.getLineCount();
Paint paint = new Paint();
paint.setTextSize(tvAle.getTextSize());
final float size = paint.measureText(tvAle.getText().toString());
Log.v("a", ""+size+" "+tvAle.getWidth());
if ((int)size > (tvAle.getWidth()+10)) {
allergiesLayout.setVisibility(View.VISIBLE);
}
else
allergiesLayout.setVisibility(View.GONE);
}
但此解决方案不起作用。
答案 0 :(得分:54)
您可以使用以下提供的方法:getEllipsisCount
Layout layout = textview1.getLayout();
if(layout != null) {
int lines = layout.getLineCount();
if(lines > 0) {
int ellipsisCount = layout.getEllipsisCount(lines-1);
if ( ellipsisCount > 0) {
Log.d(TAG, "Text is ellipsized");
}
}
}
可以通过getLineCount()
获取行答案 1 :(得分:10)
嗯,接受的解决方案确实有效,但是错过了一些极端情况,因为它只会检查椭圆化字符的最后一行。如果我们有一个由两行组成的TextView并使用TruncateAt.START截断文本的开头,则接受的答案将失败。 : - /
添加ViewTreeObserver.OnPreDrawListener对我来说似乎更像是一个非常昂贵的开销。所以我对接受的答案的代码进行了以下改进:
/**
* Checks if the text of the supplied {@link TextView} has been ellipsized.
*
* @param textView
* The {@link TextView} to check its text.
*
* @return {@code True} if the text of the supplied {@code textView} has been ellipsized.
*/
public static boolean isTextViewEllipsized(final TextView textView) {
// Check if the supplied TextView is not null
if (textView == null) {
return false;
}
// Check if ellipsizing the text is enabled
final TextUtils.TruncateAt truncateAt = textView.getEllipsize();
if (truncateAt == null || TextUtils.TruncateAt.MARQUEE.equals(truncateAt)) {
return false;
}
// Retrieve the layout in which the text is rendered
final Layout layout = textView.getLayout();
if (layout == null) {
return false;
}
// Iterate all lines to search for ellipsized text
for (int line = 0; line < layout.getLineCount(); ++line) {
// Check if characters have been ellipsized away within this line of text
if (layout.getEllipsisCount(line) > 0) {
return true;
}
}
return false;
}
但仍有改进的余地。但是这种方法足以满足我的用例。我们赞赏更正和改进。 : - )
答案 2 :(得分:1)
使用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;
}
});
确保不要在XML中设置maxLineCount。然后你可以在你的代码中检查lineCount,如果它大于某个数字,你可以返回false来取消TextView的绘图并设置行数以及一个标志来保存textView是否太长或者不。 textview将使用正确的行数再次绘制,您将知道它是否已经椭圆化了。
然后,您可以使用isEllipsized标志执行您需要的任何操作。