簡體   English   中英

為什么LinearLayout子getWidth方法返回0?

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

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