2011-02-06 93 views
6

我有一些文字会放在TextView中。我使用setText()来做到这一点。获取TextView的高度

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

是否有无论如何获得TextView中存在的文本的高度?

+1

在渲染完成之前,您无法获取视图的高度,这就是为什么您在设置文本后检查高度时始终返回0的原因。你为什么需要知道身高?请详细解释你正在努力实现的目标。 – 2011-02-06 11:30:40

+0

实际上,我开发了一个应用程序,它可以逐页显示文本和图像(就像电子书阅读器一样)(我的意思是它不应该包含任何滚动条)。所以,当我有大量的文本要放,我需要知道文本在屏幕上占有多少,以便它适合屏幕.. – 2011-02-06 13:34:32

回答

6

正如约翰指出,你将不能够的setText后,立即得到了高度。我不确定在TextView上使用getHeight()会对你有多大的帮助。视图的高度不仅取决于视图中可见文本的高度,还取决于TextView所在的视图组/布局。如果视图组告诉TextView最大化高度,getHeight()将使您无法获得任何位置如果你等到文字被渲染后。

我看到许多方面是可以这样做:

  1. TextView的子类,并覆盖onSizeChanged方法。在那里,调用supersizeSize,然后通过getLineCount()获取TextView中的行数,并使用getLineHeight()获取每行的高度。这可能会或可能不会比使用getHeight()更好,具体取决于您的布局或内容。
  2. 请勿使用Textviews维度。使用TextView.getPaint()获取TextViews Paint,然后从

    计算宽度和高度Rect bounds; paint.getTextBounds(text,0,text.length(),bounds);

您现在将有尺寸在边界内。您现在可以使用paint.breakText来查看您将在一行中放入多少文本。可能太多的麻烦,并没有保证(对我的未经训练的眼睛)与TextView使用的逻辑相同。

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); 
     } 
    }); 

这段代码我在这里找到:How to retrieve the dimensions of a view?

+0

我想我可以从这里得到一些有用的东西.. thnq .. – 2011-02-06 17:37:57