[英]How to get an Android widget's size after layout is calculated?
我有一個布局,指定相對維度的小部件大小,例如:
<LinearLayout ... layout_height="fill_parent">
<ImageView ... layout_height="wrap_content" />
<TextView ... layout_height="120dp" />
</LinearLayout>
在onCreate
之后,我想知道ImageView的高度是多少。 怎么做?
注意:如果我在onCreate
調用getHeight()
,我得到0。
我也試過imageView.postDelayed
,它適用於2.1模擬器,但在1.5模擬器上失敗(我也得到0)。
最后,我嘗試創建一個Handler
,然后我調用handler.postDelayed
,延遲時間為10毫秒。 它適用於2.1和1.5模擬器,但是當我在eclipse調試器中啟動程序時失敗(因此,我得出結論,使用延遲並不能保證在imageview布局后獲得高度。)
你獲得大小為0的原因是,在完全創建活動之后,布局才會完成,即onCreate(),onStart()和onResume()都已經完成。 我知道獲得確切大小的最簡單方法是在布局完成后調用您的方法,例如在按鈕上使用單擊偵聽器。 由於在布局完成之前不會顯示該按鈕,因此在觸發其單擊偵聽器時,該大小必須可用。
這只是一個猜測,但我想這很難做到,因為他們不希望人們在系統剛剛完成屏幕布局后弄亂布局大小。 如果他們提供了“onLayoutFinished()”回調,那么如果你修改了布局,你可能會陷入循環。 例如,想象一下:布局完成; 調用onLayoutFinished()並修改其中的布局; 現有布局現在無效; 布局重新完成; onLayoutFinished()再次調用; 你的代碼再次被調用 - 依此類推。
另一種方法是創建自定義View並覆蓋onMeasure(int, int)
方法。 系統觸發該方法以獲取每個View的大小; 如果您使用類似我的示例,您可以在布局完成之前獲得建議的大小:
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
//getMeasuredHeight() and getMeasuredWidth() now contain the suggested size
}
(我寫道它是建議的大小,因為我認為可以根據布局限制在此之后更改大小。但是,這是我剛才讀過的內容的模糊記憶,我從未詳細試驗過。)一旦你完成后,你可以使用大小來做你想做的事情 - 你甚至可以通過使用setMeasuredDimension(newX, newY)
來改變它將使用的大小。
View對象提供了名為onSizeChanged的方法(int w,int h,int oldw,int oldh)。 當布局更改其中一個組件的大小時調用它。 如果您覆蓋此方法,則此方法版本中的代碼將知道其自身的大小,如下面的代碼段所示。
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
bounds = new Rect();
this.getDrawingRect(bounds);
// bounds will now contain none zero values
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.