以编程方式获取 TextView 的宽度

Posted

技术标签:

【中文标题】以编程方式获取 TextView 的宽度【英文标题】:Programmatically getting the width of a TextView 【发布时间】:2011-02-05 03:27:50 【问题描述】:

我正在尝试以编程方式构建布局。

此布局是动态的。根据从数据库中读取的数据,每次看起来都可能不同。

我有一个 LinearLayout,它的方向设置为垂直。

我想在“行”上尽可能多地使用文本(来自数据库的数据)来放置 TextView。

我正在做的是构建作为行的线性布局。这些 LinearLayout 填充了 TextView。我构建了 TextView,设置了文本,然后检查宽度以查看它是否适合这一行(通过从屏幕宽度中减去所有 TextView 宽度的总和,看看新的 TextView 是否适合)。如果没有,我创建一个新的 LinearLayout 并开始向其中添加 TextViews。

问题是 myTextView.getWidth() 和 myTextView.getMeasuredWidth() 都返回 0。

为什么?如何获取 TextView 的宽度?

【问题讨论】:

我认为,可能是您调用 getWidth() 太早了...顺便说一句,您在哪里调用它?看起来你可能在 onCreate() 中做,你可以尝试在 onMeasure() 中调用 【参考方案1】:

首先,请发布您的代码。其次,getWidth/getHeight 返回零问题被问A LOT,因此您可以搜索 SO 以获得更多答案。

假设您在 onCreate 期间调用了这些方法(可能是这种情况),UI 尚未绘制,因此返回值为零。在绘制之前,您无法获取视图的宽度或高度。

【讨论】:

使用 AsyncQueryHandler,我从数据库中查询数据。 AsyncQueryhandler 在 onResume() 中被调用。获取光标后,我调用一个方法来使用数据构建视图对象。我已经尝试立即将新创建的 TextView 添加到已绘制的 LinearLayout 中,但 TextView 上的 getWidth() 仍然返回 0。我知道它是 0,因为它还没有被绘制。我只是不知道如何绕过它(意思是,我不知道如何让绘图代码运行以便我可以获取宽度)。 你试过onLayout()吗? :当此视图应为其每个子级分配大小和位置时,从布局中调用。有孩子的派生类应该重写这个方法并在他们的每个孩子上调用布局。 其实可以在绘制之前获取一个view的宽高。使用measure,比如view.measure(View.Measurespec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED),然后就可以得到预绘制的measuredWidth()和measuredHeight()。他可能再次问的一个原因是因为整个 SO 的解决方案都很糟糕,人们使用设置为任意值的计时器和处理程序,以便他们可以使用 getWidth() 和 getHeight()。这种方法很糟糕,没有意义。【参考方案2】:

您可以使用此库将执行宽度计算的任务安排到视图完全绘制后的正确时间

您可以通过onCreate() 和任何Thread 调用它

https://github.com/Mohamed-Fadel/MainThreadScheduler

使用示例:

MainThreadScheduler.scheduleWhenIdle(new Runnable() 
       @Override
       public void run() 
           int width = textview.getWidth();
           int height = textview.getHeight();
           textview.setText( String.valueOf( width +","+ height ));
       
   );

【讨论】:

以上是关于以编程方式获取 TextView 的宽度的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式调整TextView的大小

Swift - 以编程方式居中 UITextView

Android - 我无法以编程方式设置 EditText 布局宽度

如何在android中以编程方式设置ImageView的高度宽度?

SpannableString的使用

如何以编程方式在 Android 中获取图像按钮的宽度和高度