动态扩展文本以确保它适合单行textview

时间:2012-02-20 10:19:20

标签: android layout

我正在尝试制作一个缩放内容的文本视图,以便全部显示,无裁剪,多行或省略。

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

*有一个包含多个行和列的网格视图。 * 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在被适配器放入Gridview之后被调用,因此我将在那里执行我的代码,但以下是可能的以及如何: -

  • TextView设置为填充父级的宽度,我可以准确地告诉文本的可用空间宽度的像素大小吗? (我相信可能存在填充等问题)
  • 然后我打算使用measureText(String)查看文本是否合适,如果不是缩小尺寸并再次检查。

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

任何帮助都将不胜感激。

  • 安东尼

2 个答案:

答案 0 :(得分:1)

您无需为此创建自定义文本视图。使用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);
    }
}

答案 1 :(得分:0)

为什么不尝试相同的方法,而是使用measureText

while (mPaint.measureText(MyTextString)>mTextView.getWidth() ) //maybe adjust for padding/margins etc
{
    mPaint.setTextSize(... currentsize - 1);
}