8

我正在尝试将文本添加到我已将其宽度设置为 Wrap_content 的文本视图中。我正在尝试获取此文本视图的宽度。但它在所有情况下都显示为 0。将文本设置为文本视图后,如何获取文本视图的宽度。

代码如下:

        LinearLayout ll= new LinearLayout(this);
        ll.setOrientation(LinearLayout.VERTICAL);
        TextView tv = new TextView(this);
        tv.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));
        ll.addView(tv);
        tv.setText("Hello 1234567890-0987654321qwertyuio787888888888888888888888888888888888888888888888888");
        System.out.println("The width is == "+tv.getWidth());// result is 0
        this.setContentView(ll);

请建议。提前致谢。

4

8 回答 8

11

只有在布局过程完成后( http://developer.android.com/reference/android/view/View.html#Layout),具有动态宽度/高度的视图才能获得正确的大小。
您可以将 OnLayoutChangeListener 添加到您的 TextView 并在那里获取它的大小:

tv.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
           public void onLayoutChange(View v, int left, int top, int right, int bottom, 
                                      int oldLeft, int oldTop, int oldRight, int oldBottom) {
                        final int width = right - left;
                        System.out.println("The width is == " + width);                
    });
于 2013-04-15T22:34:37.017 回答
3

在完全构建布局之前,您无法获得具有动态大小的 View 的宽度。这意味着您无法在 onCreate() 中获取它。一种方法是创建一个继承自 TextView 并覆盖的类onSizeChanged()

于 2013-04-15T18:07:42.523 回答
1

你什么时候打电话给这个?它已经被绘制到屏幕上了吗?

听起来你打电话getWidth()太早了。

你也可以看看这个问题

于 2013-04-15T18:06:51.937 回答
0

你应该使用这个:

textView.getMeasuredWidth();

于 2014-02-26T09:57:09.017 回答
0

你可以试试这个:

textView.measure(0,0);
int width = textView.getMeasuredWidth();
于 2017-05-05T03:53:49.157 回答
0

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

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 ));
       }
   });
于 2018-03-20T12:19:46.343 回答
0

你好用这个方法:

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

});

来源:https ://gist.github.com/omorandi/59e8b06a6e81d4b8364f

于 2017-12-20T19:59:33.980 回答
0

这对我有用:

RelativeLayout.LayoutParams mTextViewLayoutParams = (RelativeLayout.LayoutParams) mTextView.getLayoutParams();
mTextView.setText(R.string.text);
mTextView.measure(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
int width = mShareTip.getMeasuredWidth();
//use the width to do what you want
mShareTip.setLayoutParams(mShareTipLayoutParams);
于 2016-06-06T07:06:26.937 回答