我正在尝试制作一个缩放内容的 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/