[英]Why does LinearLayout child getWidth method return 0?
我有一個LinearLayout,這個LinearLayout將保存動態放置的視圖。 我需要找出LinearLayout子元素的寬度,但是必須在onCreate方法中完成。 從研究中我發現你不能使用這種方法的getWidth。 所以我使用onWindowFocusChanged,它適用於父LinearLayout(返回實際大小),但它不適用於它的子節點。
我注意到的另一件事是當屏幕消失並且屏幕被鎖定時,我可以在日志中看到返回的孩子的實際寬度(我認為活動正在暫停)。
我真的被卡住了,這是必要的,因為我需要根據子寬度動態放置這些視圖。
您可以使用以下內容。 但正如其他人指出的那樣,這可能不是一個好主意。
LinearLayout.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
LinearLayout.getMeasuredWidth();
在onCreate中,視圖仍然無法知道附近視圖和子項等的狀態...所以只有在准備好並且布局過程完成后,您才能獲得視圖的大小。
這是一個快速的代碼,用於在繪制之前獲取視圖的大小:
private static void runJustBeforeBeingDrawn(final View view, final Runnable runnable)
{
final ViewTreeObserver vto = view.getViewTreeObserver();
final OnPreDrawListener preDrawListener = new OnPreDrawListener()
{
@Override
public boolean onPreDraw()
{
Log.d(App.APPLICATION_TAG, CLASS_TAG + "onpredraw");
runnable.run();
final ViewTreeObserver vto = view.getViewTreeObserver();
vto.removeOnPreDrawListener(this);
return true;
}
};
vto.addOnPreDrawListener(preDrawListener);
}
或者,如果您願意,可以使用addOnGlobalLayoutListener
而不是addOnPreDrawListener
。
用法示例:
runJustBeforeBeingDrawn(view,new Runnable()
{
@Override
public void run()
{
int width=view.getWidth();
int height=view.getHeight();
}
});
另一種方法是使用onWindowFocusChanged(並檢查hasFocus == true),但這並不總是最好的方法(僅用於創建簡單視圖,而不用於動態創建)
編輯:runJustBeforeBeingDrawn的替代方案: https ://stackoverflow.com/a/28136027/878126
https://stackoverflow.com/a/3594216/1397218
所以你應該以某種方式改變你的邏輯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.