22

我有一个包含多行 TextView 的 Android 应用程序布局。当屏幕处于纵向时,TextView 可以显示与在横向模式下运行时不同的文本长度。此外,在小屏幕上运行时,TextView 可以显示与在大屏幕上运行时不同的文本长度。

有什么方法可以检查文本是否适合或将被截断?或者有什么方法可以检查 TextView 是否已满?

问题是 TextView 可能包含不同数量的行,具体取决于它是横向、纵向、小屏幕、大屏幕等。

感谢您的意见,

此致,

詹姆士

4

6 回答 6

15

这些答案对我来说效果不佳。这就是我最终做的

Paint measurePaint = new Paint(myTextView.getPaint());
float pWidth = measurePaint.measureText("This is my big long line of text. Will it fit in here?");
float labelWidth = myTextView.getWidth();
int maxLines = myTextView.getMaxLines();

while (labelWidth > 0 && pWidth/maxLines > labelWidth-20) {
    float textSize = measurePaint.getTextSize();
    measurePaint.setTextSize(textSize-1);
    pWidth = measurePaint.measureText("This is my big long line of text. Will it fit in here?");
    if (textSize < TypedValue.applyDimension(
            TypedValue.COMPLEX_UNIT_SP, 7,
            getContext().getResources().getDisplayMetrics())) break;
}

myTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, measurePaint.getTextSize());

我并不是说这适用于所有情况,因为我肯定在这里偷工减料,但总体思路是用 textview 的油漆测量文本并不断缩小它,直到它适合 textview。

于 2014-08-09T21:48:38.350 回答
10

我找到了一个“厚颜无耻”的解决方案来解决在 MULTILINE TextView 中测量文本高度的问题 -

//Calculate the height of the text in the MULTILINE TextView
int textHeight = textView.getLineCount() * textView.getLineHeight();
if (textHeight > textViewHeight) {
    //Text is truncated because text height is taller than TextView height
} else {
    //Text not truncated because text height not taller than TextView height
}

但是,此解决方案有一些注意事项: -

首先关于 getLineHeight() ,文本中的标记可能会导致个别行高于或低于此高度,并且布局可能包含额外的第一行或最后一行填充。请参阅http://developer.android.com/reference/android/widget/TextView.html#getLineHeight()

其次,应用程序需要以像素为单位计算 TextView 的实际高度,并且(就我的布局而言)它可能不像 textView.getHeight() 那样简单,并且计算可能因布局而异。

我建议避免使用LinearLayout,因为 TextView 的实际像素高度可能因文本内容而异。我正在使用 RelativeLayout(请参阅http://pastebin.com/KPzw5LYd)。

使用这个RelativeLayout,我可以按如下方式计算我的TextView 高度:-

//Calculate the height of the TextView for layout "http://pastebin.com/KPzw5LYd"
int textViewHeight = layout1.getHeight() - button1.getHeight() - button2.getHeight();

希望有帮助,

问候,

詹姆士

于 2013-08-07T19:06:53.980 回答
4

基本上,当方向模式改变时,您需要计算文本视图的大小和文本的大小。尝试ViewTreeObserver.OnGlobalLayoutListener这样做。

在改变方向方法里面:

main_view.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {

        @Override
        public void onGlobalLayout() {
            main_view.getViewTreeObserver().removeGlobalOnLayoutListener(this);
            //Calculation goes here
            int text_size = getTextSize(text_view.getText().toString());
            int text_view_size = text_view.getLayoutParams().width;
            //Compare your text_size and text_view_size and do whatever you want here.
        }
    });

下面是计算 text_size 的代码:

private int getTextSize(String your_text){
    Paint p = new Paint();
    //Calculate the text size in pixel
    return p.measureText(your_text);
}

希望这有帮助。

于 2013-08-07T03:22:56.013 回答
0

要检查多行(或不)TextView 是否会被截断,请查看这篇文章

或者,您是否考虑过使用滚动文本视图?(选框)..如果对于给定的宽度来说太长,文本将在哪里滚动(水平,动画)?

这是布局文件中的一个示例 TextView,它具有以下一些特征:

<TextView
    android:id="@+id/sometextview"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:ellipsize="marquee"
    android:marqueeRepeatLimit="marquee_forever"
    android:singleLine="true"
    android:scrollHorizontally="true"
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:freezesText="true"
    android:textColor="#808080"
    android:textSize="14sp"
    android:text="This is a long scrolling line of text.. (etc)"/>
于 2013-08-06T18:37:49.053 回答
0

只需检查 textView.getLineCount(),如果行数 > 1,那么您的文本是多行的

于 2021-01-29T13:56:42.103 回答
0

Kotlin 中的这个扩展函数对我有用,只要确保在视图已经布置好时调用它,例如view.post()对我来说是个好地方;

/**
 * Make sure to call this method only when view layout is finished, e.g. view.post() is a good place to check this
 */
fun TextView.isTruncated() = (lineCount * lineHeight) > height

用法

textView.post {
    if(isTruncated()) {
        // Do something
    }
}
于 2021-03-06T14:30:25.977 回答