如果文字太长,我试图将省略号设置为文本末尾(多行)。
我已经知道我可以使用setMaxLines()
和setEllipsize()
来达到效果。但是,由于我的textview的大小是动态可更改的,因此我不知道可以显示的最大行数。相反,我有textview的高度(按像素)。
如何根据视图的高度和文本(包括字体属性)设置省略号?如果没有我可以使用的直接可用资源,那么最简单的方法是什么?
答案 0 :(得分:1)
您可以使用getLineCount()
(但仅在布局通过后)。
有关详细信息,请参阅this answer。
答案 1 :(得分:0)
我已经使用this answer的概念实现了这一点。
您可以创建像这样的扩展功能-
/**
* Calculate max lines according height
*
* @param text- text need to be set
* @param lineCount- invoked with -1 if view height is enough to show full text,
* otherwise invoked with maxLines
*/
inline fun TextView.calculateMaxLines(text: String, crossinline lineCount: (Int) -> (Unit)) {
val params: PrecomputedTextCompat.Params = TextViewCompat.getTextMetricsParams(this)
val ref: WeakReference<TextView>? = WeakReference(this)
GlobalScope.launch(Dispatchers.Default) {
val computedText = PrecomputedTextCompat.create(text, params)
ref?.get()?.apply {
TextViewCompat.setPrecomputedText(this, computedText)
GlobalScope.launch(Dispatchers.Main) {
ref.get()?.let {
val bounds = it.getLineBounds(0, null)
val heightRequired = bounds * it.lineCount
val maxLines = if (heightRequired > height) {
height / bounds
} else -1
lineCount.invoke(maxLines)
}
}
}
}
}
然后您可以调用它并像这样设置maxLines-
textView.calculateMaxLines("Line 1\nLine2\nLine3\nLine4\nLine5\nLine6\nLine7\nLine8") {
if (it >= 0) {
tvUserName.maxLines = it
tvUserName.ellipsize = TextUtils.TruncateAt.END
}
}
或者,对于Java,您可以这样称呼它-
ExtensionsKt.calculateMaxLines(textView, text, maxLines -> {
if (maxLines >= 0) {
textView.setMaxLines(maxLines);
textView.setEllipsize(TextUtils.TruncateAt.END);
}
return null;
});