我的android应用程序中有一个TextView,它有一个设置的宽度。它目前的重力是“center_horitonzal”和一个textSize(9sp)。我从sqlite数据库中提取值以放置此标签,并且某些值太大而无法放入当前textSize的TextView中。
有没有办法检测TextView中的文本是否会被剪裁?我想检测一下,然后降低字体直到它适合。 iPhone UILabel中有一个很好的属性可以处理这个名为“adjustToFit”(也有最小字体大小),我基本上都试图模仿它。
以下是我正在使用的TextView示例:
<TextView android:id="@+id/label5" android:layout_width="62px"
android:layout_height="wrap_content" android:layout_x="257px"
android:layout_y="169px" android:textSize="9sp"
android:textColor="#000"
android:typeface="sans" android:textStyle="bold"
android:gravity="center_horizontal" android:lines="1" />
答案 0 :(得分:6)
我找到了一种使用TextView的Paint对象测量文本宽度的方法,并降低它直到它符合我需要的大小。这是一些示例代码:
float size = label.getPaint().measureText(item.getTitle());
while (size > 62) {
float newSize = label.getTextSize() - 0.5f;
label.setTextSize(newSize);
size = label.getPaint().measureText(item.getTitle());
}
答案 1 :(得分:0)
另一种方法(可能相同)是这样的:
TextView title = new TextView(context) {
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int textsize = 30;
setTextSize(textsize);
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
while (getMeasuredHeight() > MeasureSpec.getSize(heightMeasureSpec)) {
textsize--;
setTextSize(textsize);
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
};
只是警告这似乎有效,但我只是将它们放在一起 - 可能是一些可以测量TextView的边缘情况。
答案 2 :(得分:0)
我写了这个函数来修剪文本末尾的字母,直到满足一定的宽度要求。
0.38功能是设置我要用这个文字填充的屏幕的比例,在这种情况下,它是38%,因为我希望它覆盖~40%,包括填充。为我测试过的案例工作过。
使用此代码调用下面的函数
DisplayMetrics metrics = new DisplayMetrics();
activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
double maxWidth = (double)metrics.widthPixels*0.38 - 1;
TextPaint painter = station.getPaint();
String left = item.getLocationName();
left = trimToLength(painter, left, maxWidth);
textView.setText(left);
public String trimToLength(TextPaint painter, String initialText, double width)
{
String message = initialText;
String output = initialText;
float currentWidth = painter.measureText(output);
while (currentWidth > width)
{
message = message.substring(0, message.length()-1);
output = message + "...";
currentWidth = painter.measureText(output);
}
return output;
}