android - 动态缩放文本以确保它适合单行 TextView

标签 android layout

我正在尝试制作一个缩放内容的 TextView ,以便它全部显示,没有裁剪、多行或省略号。

我将快速浏览布局以将其置于上下文中。

*有一个包含多个行和列的 GridView 。 *gridview 的项目由返回(伪标记 :) )的适配器提供:-

<LinearLayout Orientation=vertical>
    <MyCustomTextview name='titletext' Not multiline />
    <MyCustomTextview name='itemtext' Not multiline />
</LinearLayout>

我已经尝试覆盖 onSizeChanged 因为这是几个谷歌结果指向我的地方,我开始:-

...
if (this.getLinecount() > 1)
{
    this.setTextSize(... currentsize -10);
}
...

这给了我非常小的文本,它会出现在多行上,所以我知道我可以调整大小并确定 TextView 是否正确地多于一行。

所以我进步到:-

while (this.getLinecount() > 1)
{
    this.setTextSize(... currentsize - 1);
}

我希望它运行到文本足够小,但是在调用 setTextSize getLineCount() 后返回 0,我相信这是因为它需要重新计算文本大小所以我尝试了 refreshLayout()、forceLayout 的各种组合() 和 invalidate() 无济于事。

我有一个也许更好的方法的想法,但我不知道它是否容易实现:-

onSizeChanged 在 Adapter 放入 Gridview 后被调用,因此我将在那里执行我的代码,但是否可能以及如何执行:-

  • TextView 设置为填充父级的宽度,我能否准确判断文本可用空间宽度的像素大小? (我相信可能有填充等应用)
  • 然后我打算使用 measureText(String) 来查看文本是否适合,如果不适合则减小尺寸并再次检查。

我相信这将是一个很好的解决方案,但我不确定可用空间的准确测量,以及我选择的事件是否是最好的。

如有任何帮助,我们将不胜感激。

  • 安东尼

最佳答案

您不需要为此创建自定义 TextView 。使用 ViewTreeObserver 获取所需的功能。

TextView tv = (TextView)findViewById(R.id.mytextview); 
ViewTreeObserver vto = tv.getViewTreeObserver();
vto.addOnGlobalLayoutListener(this);

@Override
public void onGlobalLayout() {
    if (1 < tv.getLineCount()) {
        tv.setTextSize(TypedValue.COMPLEX_UNIT_PX,
                tv.getTextSize() - 2);
    }
}

关于android - 动态缩放文本以确保它适合单行 TextView ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9359507/

相关文章:

android - 从 Android 应用程序打开 Whatsapp 联系人列表

wpf - 需要帮助理解 WPF MeasureOverride 和 ArrangeOverride 无穷大和 0 尺寸

java - 如何在 Java 中制作 Treelayout 图

android - View 中的位图未在 Android 上显示

java - Eclipse 内容辅助错误

android - android中需要检测通话事件时,BroadcastReceiver和PhoneStateListener应该怎么选择?

java - Android以编程方式在按钮的右上角添加图片

android - maxLength ="#length"在 xml android 布局文件中意味着什么?

algorithm - 如何在二维数组上随机生成布局?

Android 如何从我的应用程序使用 SD 卡中的文件路径预览图像