在动态创建textView之前绘制textView的宽度

时间:2015-11-08 17:04:17

标签: android

我的活动右下方有imageview1。在活动开始并调用onWindowFocusChanged后,我想动态创建一个textView并将其放在imageview1(左侧)旁边。我知道我可以通过修改layoutParam来设置textView的位置但是要正确对齐它我会做以下

param.setMargins(0, imageView1.getTop(), rootLayout.getWidth()-imageView1.getLeft()-textView.getWidth, 0);

。问题是我无法找到textView的宽度,因为它尚未绘制。我怎么能绕过这个?

2 个答案:

答案 0 :(得分:1)

您可以要求视图自行测量,但您应该指定约束。例如:

final Button button = new Button(this);
button.setText("Button");
button.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
            View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
Log.d("Test", "measured width: " + button.getMeasuredWidth());
Log.d("Test", "measured height: " + button.getMeasuredHeight());

然后你得到了:

11-09 10:33:14.316 14959-14959/com.madcucumber.testapplication D/Test: measured width: 264
11-09 10:33:14.316 14959-14959/com.madcucumber.testapplication D/Test: measured height: 144

答案 1 :(得分:0)

使用onSizeChanged可能对您有用:

  

protected void onSizeChanged(int w,int h,int oldw,int oldh)

     

在API级别1中添加   当此视图的大小发生更改时,将在布局期间调用此方法。如果刚刚添加到视图层次结构中,则使用旧值0调用。

     

参数

     

w此视图的当前宽度。

     

h此视图的当前高度。

     

oldw此视图的旧宽度。

     

oldh这个观点的旧高度。

http://developer.android.com/reference/android/view/View.html#onSizeChanged(int, int, int, int)

你可以使用TreeObserver:

ViewTreeObserver vto = imageView1.getViewTreeObserver(); 
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
    @Override 
    public void onGlobalLayout() { 
        this.image1.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
        int width  = imageView1.getMeasuredWidth();
        int height = imageView1.getMeasuredHeight(); 
    } 
});