我怎么告诉你,如果我控已ellipsized?
题
我有多行 TextView
已 android:ellipsize="end"
设置。我想知道,但是,如果我在那里其实过长(这样,我可以确保完整串表示其他地方页)。
我可以用 TextView.length()
并且找到关于什么的长度的近似的串将适用,但因为它是多条线路, TextView
处理当包裹,因此这不会总的工作。
任何想法?
解决方案
您可以得到TextView
的布局,并检查每行的省略号计数。对于一个端省略号,就足够了检查的最后一行,这样的:
Layout l = textview.getLayout();
if (l != null) {
int lines = l.getLineCount();
if (lines > 0)
if (l.getEllipsisCount(lines-1) > 0)
Log.d(TAG, "Text is ellipsized");
}
这只是布局阶段之后的作品,否则返回的布局将是空的,在代码中适当的地方,以便调用它。
其他提示
textView.getLayout是要走的路,但与问题是,如果不准备布局返回null。使用下面溶液中的
ViewTreeObserver vto = textview.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Layout l = textview.getLayout();
if ( l != null){
int lines = l.getLineCount();
if ( lines > 0)
if ( l.getEllipsisCount(lines-1) > 0)
Log.d(TAG, "Text is ellipsized");
}
}
});
我认为这个问题的最简单的解决方案是将以下代码:
String text = "some looooong text";
textView.setText(text);
boolean isEllipsize = !((textView.getLayout().getText().toString()).equalsIgnoreCase(text));
此代码假定在XML TextView的设置maxLineCount
:)
这工作对我说:
textView.post(new Runnable() {
@Override
public void run() {
if (textView.getLineCount() > 1) {
//do something
}
}
});
返回要ellipsized远的字符数,或0,如果没有省略号是发生。
所以,简单地调用:
int lineCount = textview1.getLineCount();
if(textview1.getLayout().getEllipsisCount(lineCount) > 0) {
// Do anything here..
}
由于设置布局前getLayout()不能被调用,使用:
ViewTreeObserver vto = textview.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Layout l = textview.getLayout();
if ( l != null){
int lines = l.getLineCount();
if ( lines > 0)
if ( l.getEllipsisCount(lines-1) > 0)
Log.d(TAG, "Text is ellipsized");
}
}
});
最后不要忘记删除 removeOnGlobalLayoutListener 当你需要它曲子。
lateinit var toggleMoreButton: Runnable
toggleMoreButton = Runnable {
if(reviewTextView.layout == null) { // wait while layout become available
reviewTextView.post(toggleMoreButton)
return@Runnable
}
readMoreButton.visibility = if(reviewTextView.layout.text.toString() != comment) View.VISIBLE else View.GONE
}
reviewTextView.post(toggleMoreButton)
它是一些典型情况:
- 评论'reviewTextView'
- 意见可以倒塌通过一些标准
- 如果评论倒塌你显示按钮'readMoreButton'
,它正在为我
if (l != null) {
int lines = l.getLineCount();
if (lines > 0) {
for (int i = 0; i < lines; i++) {
if (l.getEllipsisCount(i) > 0) {
ellipsize = true;
break;
}
}
}
}
真工作,以便,例如,通过充分数据,以从RecyclerView的项对话框:
holder.subInfo.post(new Runnable() {
@Override
public void run() {
Layout l = holder.subInfo.getLayout();
if (l != null) {
final int count = l.getLineCount();
if (count >= 3) {
holder.subInfo.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
final int c = holder.subInfo.getLineCount();
if (c >= 3) {
onClickToShowInfoDialog.showDialog(holder.title.getText().toString(), holder.subInfo.getText().toString());
}
}
});
}
}
}
});
在科特林方式:
textView.post {
if (textView.lineCount > MAX_LINES_COLLAPSED) {
// text is not fully displayed
}
}
实际上视图已经被渲染之后执行View.post()
和将运行提供的功能
使用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
的绘制并设置行数以及一个标志保存文本视图是否过长或不。文本视图会用正确的行数再次战平,你就会知道它是否ellipsized或不与标志。
您可以再使用isEllipsized
标志做任何你需要。
您的 TextViewUtils 强>类
内创建一个方法public static boolean isEllipsized(String newValue, String oldValue) {
return !((newValue).equals(oldValue));
}
在需要时例如调用此方法:
if (TextViewUtils.isEllipsized(textviewDescription.getLayout().getText().toString(), yourModelObject.getDescription()))
holder.viewMore.setVisibility(View.VISIBLE);//show view more option
else
holder.viewMore.setVisibility(View.GONE);//hide
但<强> textView.getLayout() 强>视图之前不能调用(布局)集。