我有一个设置TextView
的多行android:ellipsize="end"
。但是,我想知道,如果我放在那里的字符串实际上太长了(这样我可以确保在页面的其他地方显示完整的字符串)。
我可以使用TextView.length()
找到字符串的大致长度,但由于它是多行,TextView
处理何时换行,所以这并不总是有效。
有什么想法吗?
答案 0 :(得分:110)
您可以获取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");
}
这仅适用于布局阶段,否则返回的布局将为null,因此请在代码中的适当位置调用此方法。
答案 1 :(得分:30)
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");
}
}
});
答案 2 :(得分:19)
我认为这个问题最简单的解决方案是以下代码:
String text = "some looooong text";
textView.setText(text);
boolean isEllipsize = !((textView.getLayout().getText().toString()).equalsIgnoreCase(text));
此代码假定在您的XML中,TextView设置了maxLineCount
:)
答案 3 :(得分:4)
这对我有用:
textView.post(new Runnable() {
@Override
public void run() {
if (textView.getLineCount() > 1) {
//do something
}
}
});
答案 4 :(得分:3)
public int getEllipsisCount (int line):
返回要椭圆化的字符数,如果不进行省略则返回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 。
答案 5 :(得分:3)
我发现的最有说服力的解决方案(在 Kotlin 中)是在 TextView
上创建一个扩展函数
fun TextView.isEllipsized() = layout.text.toString() != text.toString()
这很棒,因为它不需要知道完整的字符串是什么,也不需要担心 TextView
使用了多少行。
TextView.text
是它试图显示的全文,而 TextView.layout.text
是实际显示在屏幕上的内容,所以如果它们不同,它必须被省略
使用:
if (my_text_view.isEllipsized()) {
...
}
答案 6 :(得分:2)
我已经为这个问题创建了一个带有侦听器通知的自定义TextView。它还修复了多线椭圆问题。您可以在android ellipsize multiline textview
找到它答案 7 :(得分:2)
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)
这是一些典型的情况:
答案 8 :(得分:1)
这对我有用
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;
}
}
}
}
答案 9 :(得分:1)
简单的Kotlin方法。允许使用android:ellipsize
和android:maxLines
fun isEllipsized(textView: TextView, text: String?) = textView.layout.text.toString() != text
答案 10 :(得分:0)
确实可行,例如,将完整数据传递给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());
}
}
});
}
}
}
});
答案 11 :(得分:0)
科特林方式:
textView.post {
if (textView.lineCount > MAX_LINES_COLLAPSED) {
// text is not fully displayed
}
}
实际上View.post()
在呈现视图之后执行,并将运行提供的功能
答案 12 :(得分:0)
将@Thorstenvv遮阳篷与@Tiano修复程序结合在一起,这是Kotlin版本:
val layout = textView.layout ?: return@doOnLayout
val lines = layout.lineCount
val hasLine = lines > 0
val hasEllipsis = ((lines - 1) downTo 0).any { layout.getEllipsisCount(it) > 0 }
if (hasLine && hasEllipsis) {
// Text is ellipsized
}
答案 13 :(得分:0)
在科特林中,您可以使用以下代码。
var str= "Kotlin is one of the best languages."
textView.text=str
textView.post {
val isEllipsize: Boolean = !textView.layout.text.toString().equals(str)
if (isEllipsize) {
holder.itemView.tv_viewMore.visibility = View.VISIBLE
} else {
holder.itemView.tv_viewMore.visibility = View.GONE
}
}
答案 14 :(得分:0)
这是用于创建可扩展文本视图的简单库。喜欢继续或更少。这个库扩展版本TextView。易于使用。
implementation 'com.github.mahimrocky:ShowMoreText:1.0.2'
像这样, 1 https://raw.githubusercontent.com/mahimrocky/ShowMoreText/master/screenshot1.png
2 https://raw.githubusercontent.com/mahimrocky/ShowMoreText/master/screenshot2.png
<com.skyhope.showmoretextview.ShowMoreTextView
android:id="@+id/text_view_show_more"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/text"
/>
在活动中,您可以使用:
ShowMoreTextView textView = findViewById(R.id.text_view_show_more);
//You have to use following one of method
// For using character length
textView.setShowingChar(numberOfCharacter);
//number of line you want to short
textView.setShowingLine(numberOfLine);
答案 15 :(得分:0)
如果您的 textview 包含多个段落,则使用 getEllipsisCount 将不适用于其中的空行。任何段落最后一行的 getEllipsisCount 将返回 0。
答案 16 :(得分:0)
带有 kotlin 扩展的解决方案:
infoText.afterLayoutConfiguration {
val hasEllipsize = infoText.hasEllipsize()
...
}
扩展:
/**
* Function for detect when layout completely configure.
*/
fun View.afterLayoutConfiguration(func: () -> Unit) {
viewTreeObserver?.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {
override fun onGlobalLayout() {
viewTreeObserver?.removeOnGlobalLayoutListener(this)
func()
}
})
}
fun TextView.hasEllipsize(): Boolean = layout.getEllipsisCount(lineCount - 1) > 0
答案 17 :(得分:-1)
在 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() 无法在视图(布局)设置之前调用。
答案 18 :(得分:-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
的绘图并设置行数以及标记到保存文本视图是否太长。文本视图将使用正确的行数再次绘制,您将知道它是否已经椭圆化了。
然后,您可以使用isEllipsized
标记执行您需要的任何操作。