我有一个包含多行TextView的Android应用程序布局。当屏幕处于纵向方向时,TextView可以在横向模式下运行时显示不同长度的文本。此外,当在小屏幕上运行时,TextView可以在更大的屏幕上运行时显示不同长度的文本。
有什么方法可以检查文本是否适合或将被截断?或者有什么方法可以检查TextView是否已满?
问题是TextView可能包含不同数量的行,具体取决于它是横向,纵向,小屏幕,大屏幕等。
感谢您的建议,
致以最诚挚的问候,
詹姆斯
答案 0 :(得分:9)
这些答案对我来说效果不佳。这就是我最终做的事情
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。
答案 1 :(得分:8)
我找到了一个“厚脸皮”的解决方案来解决在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();
希望有所帮助,
此致
詹姆斯
答案 2 :(得分: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);
}
希望得到这个帮助。
答案 3 :(得分:0)
要检查多行(或不是)TextView是否会被截断,请检查this post。
或者,您是否考虑过使用滚动文本视图? (marquee)..如果给定宽度的文本太长,文本将滚动(水平,动画)?
以下是布局文件中的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)"/>
答案 4 :(得分:0)
只需检查 textView.getLineCount(),如果行数 > 1,则您的文本是多行的
答案 5 :(得分: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
}
}