如何检查TextView的文本是否超过最大行

时间:2018-04-28 01:28:36

标签: android textview

有没有办法检查TextView的文本是否超过最大行数?我找到了TextView.getLineCount(),但这只能告诉我是否使用了最大行,而不是我已超过它。

修改
到目前为止,我有:

text_view.post(new Runnable() {
            @Override
            public void run() {
                if (text_view.getLineCount() < text_view.getMaxLines()) {
                    // do stuff
                }
            }
});

但是这不会检测它是否超过最大行,即如果if语句使用大于或等于max行,则if语句将通过。这是因为如果它使用超过最大线,那么getLineCount只返回最多的行,而不是更多。

请注意,文本视图的文本在我的代码中以编程方式设置得更高,而不是在XML中进行硬编码。

2 个答案:

答案 0 :(得分:1)

不确定是否有更好的方法,但是我通过检查将maxLines设置得更高会发生什么,并在测量后查看它是否仍适合原始的maxLines。

如果您还希望从TextView的折叠模式到扩展模式进行漂亮的动画处理,请查看我的解决方案here

如果没有,这是我针对这个非常具体的问题的解决方案:

MainActivity.kt

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val expectedWidthOfTextView = resources.displayMetrics.widthPixels
        val originalMaxLines = textView.maxLines
        if (originalMaxLines < 0 || originalMaxLines == Integer.MAX_VALUE)
            Log.d("AppLog", "already unbounded textView maxLines")
        else {
            textView.maxLines = originalMaxLines + 1
            textView.measure(
                View.MeasureSpec.makeMeasureSpec(expectedWidthOfTextView, View.MeasureSpec.AT_MOST),
                View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)
            )
            Log.d("AppLog", "lines:${textView.lineCount}/$originalMaxLines")
            if (textView.lineCount <= originalMaxLines)
                Log.d("AppLog", "fit in original maxLines")
            else
                Log.d("AppLog", "exceeded original maxLines")
            textView.maxLines = originalMaxLines
        }

    }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent" android:orientation="vertical" android:gravity="center"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

    <TextView
            android:id="@+id/textView" android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="8dp" android:background="#1100ff00"
            android:ellipsize="end" android:maxLines="4"
            android:paddingEnd="16dp" android:paddingStart="16dp"
            android:textColor="#c1000000" android:textSize="14sp"
            android:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."/>

</LinearLayout>

答案 1 :(得分:1)

您可以执行以下操作:

textView.doOnLayout {
    if (textView.isEllipsized()) {
        // Do Something
    }
}

fun TextView.isEllipsized(): Boolean {
    val textPixelLength = paint.measureText(text.toString())
    val numberOfLines = ceil((textPixelLength / measuredWidth).toDouble())
    return lineHeight * numberOfLines > measuredHeight
}