Android TextVIew基于视图大小的省略号

时间:2015-08-12 21:49:07

标签: android textview ellipsis

如果文字太长,我试图将省略号设置为文本末尾(多行)。

我已经知道我可以使用setMaxLines()setEllipsize()来达到效果。但是,由于我的textview的大小是动态可更改的,因此我不知道可以显示的最大行数。相反,我有textview的高度(按像素)。

如何根据视图的高度和文本(包括字体属性)设置省略号?如果没有我可以使用的直接可用资源,那么最简单的方法是什么?

2 个答案:

答案 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;
        });