如何在省略号之前获取单行文本视图的最大字符数?

时间:2017-10-03 19:09:33

标签: android

我有一个与设备宽度一样宽的TextView。我有一个可以超过数百个字符的字符串。

我需要在一行中显示的是从该字符串的索引为零到(numCharsWideInTextView - 8)的字符。其余8个字符将用于添加自定义后缀。举例来说:

String label = "How can I get the maximum amount of characters for Single Line 
Text view before it ellipsis? (4392)"

String maxChars = 20;
String str = truncate(label, maxChars);
TextView tv = new TextView();

// "How can I get the ma…(#4392)" is what should appear in TextView where #4392 is a sticky suffix
tv.setText(str); 

private String truncate(String str, int maxChars) {
     String issueId = // Some regEx function to be written 
     String s = str.subString(0, maxChars)
     s += "…" + "(#" + issueId + ")"
     return s;
}

我试图不去硬编码或不得不写出不同的资源/维度值。您可以在这里看到我将其硬编码为20.如何在运行时以编程方式对此进行评估?

必须有一种方法,一种函数,它将返回在新行或椭圆形之前适合TextView的字符数。如果TextView处于Portait与Landscape配置中,则值应该不同。

我尝试梳理文档TextView,FontMetrics,Paint等,但没有运气。

1 个答案:

答案 0 :(得分:0)

private boolean isTooLarge (TextView text, String newText) {
    float textWidth = text.getPaint().measureText(newText);
    return (textWidth >= text.getMeasuredWidth ());
}

private int ellipsisedAt(TextView text, String newText) {
    for (int i = 0; i < newText.length; i++) {
         if (isTooLarge(text, newText.substring(0, i))) {
              return i;
         }
    }
    return -1;
}

为什么这不起作用?

修改

此外,您可以尝试使用MONOSPACE字体并仅测量一个符号宽度,并随处使用它。更简单的方法,更快的代码