获取TextView的高度

8

我有一些将放置在TextView中的文本。我使用setText()实现了这一点。

现在我需要找到文本在TextView中占用的行数或高度。我尝试使用getHeight(),但它始终返回0。

有没有办法获取TextView中文本的高度?


1
只有在视图被渲染之后,才能获取其高度,这就是为什么如果你在设置文本后立即检查高度,总是会返回0。为什么需要知道高度?请更详细地解释一下你想要实现什么。 - John J Smith
实际上,我需要开发一个应用程序,可以逐页显示文本和图像(就像电子书阅读器一样),而且不应该包含任何滚动条。因此,当我有大量文本要放置时,我需要知道文本在屏幕上占用了多少空间,以便它适合屏幕。 - Siva Kumar
2个回答

13

由于这个大小只有在布局完成后才知道,一种方法是创建一个自定义文本视图并使用onSizeChanged方法。另一种方法是:

    final TextView tv = (TextView) findViewById(R.id.myTextView);
    ViewTreeObserver vto = tv.getViewTreeObserver(); 
    vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
        @Override 
        public void onGlobalLayout() { 
            Toast.makeText(MyActivity.this, tv.getWidth() + " x " + tv.getHeight(), Toast.LENGTH_LONG).show();
            tv.getViewTreeObserver().removeGlobalOnLayoutListener(this);
        } 
    }); 

我在这里找到的代码:如何检索视图的尺寸?


以上代码的问题是...文本视图的高度只能在代码末尾获得...我无法在中间获取它!!我定义了一个变量来存储高度,并在onGlobalLayout()中用tv.getHeight()初始化该变量...但是直到最后,变量的值始终为0...最后变量值才改变为文本的高度... - Siva Kumar
这段代码帮助我找到了TextView的“宽度”和“高度”。 - Can Uludağ

7
正如John所指出的,您不会立即在setText之后获得高度。我不确定在TextView本身上使用getHeight()是否会对您有所帮助。视图的高度不仅取决于视图中可见文本的高度,还取决于TextView所在的视图组/布局。如果viewgroup告诉TextView最大化高度,则即使等到文本呈现出来,getHeight()也无济于事。
我看到有几种方法可以做到这一点:
1. 子类化TextView并覆盖onSizeChanged方法。在其中,调用supers onSizeChanged,然后通过getLineCount()获取TextView内的行数以及通过getLineHeight()获取每行的高度。根据您的布局或其他因素,这可能比使用getHeight()更好或更差。
2. 不要使用TextView的尺寸。使用TextView.getPaint()获取TextView的Paint,然后通过以下方式计算宽度和高度
Rect bounds; paint.getTextBounds(text, 0, text.length(), bounds);
现在您已经拥有了bounds中的尺寸。您现在可以使用paint.breakText来查看一行上适合多少文本。这可能过于麻烦,并且不能保证(在我没有接受过专业培训的情况下)与TextView使用的相同逻辑。

Kread..你能否举个例子,说明如何对TextView进行子类化,以便在子类中可以使用主类中存在的TextView对象? - Siva Kumar
你有一个公共类MyText扩展TextView { OVERRIDE METHODS HERE },在主类中,你可以使用"MyText textView = new MyText(this);"而不是"TextView textView = new TextView(this);"。如果你想使用XML布局,我建议阅读http://developer.android.com/guide/topics/ui/custom-components.html(即使是在Java中创建东西也要阅读)。 - Kevin Read
谢谢..但是onSizeChanged方法在最后被调用!!所以getLineCount不能在应用程序的中间使用!我的意思是..如果我想用textview.getLineCount()初始化一个变量,即使设置了文本,变量值直到最后仍为0。 - Siva Kumar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接