2015-11-08 47 views
2

我有一個在右下角具有imageview1的活動。在活動開始並調用onWindowFocusChanged之後,我想動態創建一個textView並將它放在imageview1(左側)旁邊。我知道我可以使用通過修改其layoutParam但以正確對齊設置的TextView的位置,我下面在動態創建textView之前查找textView的寬度

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

。問題是我找不到textView的寬度,因爲它尚未繪製。我怎樣才能解決這個問題?

+0

你嘗試用'textView.getMeasuredWidth()'? –

+0

同樣的東西,它是0 – Snake

回答

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

謝謝,看起來很有前途的你可以解釋View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED) , – Snake

+0

這是你的觀點的限制。第一個參數0沒有任何意義,但第二個參數告訴視圖像它想要的一樣。 – Bracadabra

0

也許使用onSizeChanged將是對你有用:

保護無效onSizeChanged(INT W,INT小時,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)

可以offcourse使用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(); 
    } 
}); 
+0

是的,這相當於等待視圖被繪製,我想它在 – Snake

+0

之前不是真的,onSizeChanged()在計算大小後調用。 –

+0

但是,當視圖添加到層​​次結構時會調用它。我想知道視圖的寬度,我甚至添加它之前 – Snake

相關問題