簡體   English   中英

計算布局后如何獲得Android小部件的大小?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM