找出文本是否太长而无法显示并需要换行

时间:2013-10-18 14:28:48

标签: java android layout

我有动态文本。问题是他们都应该适合一行。有没有办法可以找出Android设备是否会使用换行符创建文本以显示整个文本?

基本上我想做的是,如果设备无法全部显示在一行上,则缩短文本。这可能吗?

目前我只是在显示数据并且每次太长时间都会创建一个新行。我想出我可以在15个字符之后拆分字符串,但我想让它依赖于屏幕宽度。

我以为我可以获得屏幕宽度,但是呢?有什么建议吗?

2 个答案:

答案 0 :(得分:1)

这是你的意思吗?

TextView.setLines(1);

您还可以设置XML文件中的行数。 这样你总有一条线,如果它太长,它会在最后设置三个点。

修改

TextView.setLines(1); // Sets the number of lines for your textview
int start = textView.getLayout().getLineStart(1); // Gets the index for the start position of your text.
int end = textView.getLayout().getLineEnd(1); // Gets the index for the end position of the first line.
String date = "| 18 Oktober 2013 |"; // I don't know how you get the date so this is an example

//Set the text with only the first line and date, so you only have one line with the date.
textView.setText(textView.getText().substring(start, end - date.length()) + date); 

答案 1 :(得分:0)

要知道要显示的字符串的宽度(以像素为单位),您需要获取字体的度量标准,然后使用它来计算给定字符串的长度。例如,您可能有:

FontMetrics metrics =  this.getFontMetrics(theFont);
int width = metrics.stringWidth("sample string");

现在,我不确定你想做什么,但假设你要截断字符串然后在它之后添加“...”,那么你可能想要使用类似的东西:

FontMetrics metrics =  this.getFontMetrics(theFont);
int maxWidth = /* Get the field's width */;
String myString = "sample string";

if (metrics.stringWidth(myString) > maxWidth) {
    do {
        myString = myString.substring(0, myString.length - 1);
    } while (metrics.stringWidth(myString + "…") > maxWidth)
    myString = myString + "…";
}

请注意,在处理短字符串时,此方法应该可以正常工作。对于较长的文本,有一种更快的方法,这意味着使用AttributedString和LineBreakMesurer。看看Oracle's Text API Trail