簡體   English   中英

Android在片段中獲取布局高度和寬度

[英]Android get layout height and width in a fragment

我正在處理一個片段,我想獲得xml fragment layout包含的layout的維度。 當我嘗試代碼時

RelativeLayout myLayout = view.findViewById(R.id.myLayout);
myLayout.getHeight();

它返回0.我需要將這些尺寸放入myLayout其他對象中。

我嘗試使用:

myLayout.getViewTreeObserver().addOnGlobalLayoutListener( 
    new ViewTreeObserver.OnGlobalLayoutListener(){

        @Override
        public void onGlobalLayout() {
            mHeight = myLayout.getHeight();  
            mWidth= myLayout.getWidth();
            System.out.println("width: "+mWidth+"   height: "+mHeight);
         }
});

但是這段代碼調用了很多時間,我不確切知道它何時執行。 我需要將這些維度放入public void onActivityCreated ()方法中。 可能嗎?

有一個更清晰的解決方案,只需在片段的根視圖上使用View.post()方法,您可以調用getMeasuredHeight()/getMeasuredWidth()並獲取實際值。

例如

public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View root = inflater.inflate(R.layout.myfragment, container, false);

    root.post(new Runnable() {
        @Override
        public void run() {
            // for instance
            int height = root.getMeasuredHeight(); 
        }
    });

    return root;
}

使用ViewTreeObserver非常干凈整潔,沒有雜亂無章。

我只用android-23設備對它進行了測試,但是從1級開始,API已經有了這個方法。

無論如何,WFM。

只要發生小的視圖更改,就會調用addOnGlobalLayoutListener。 因此,您需要從視圖中刪除此偵聽器。

用法簡單:

public static void removeOnGlobalLayoutListener(View v, ViewTreeObserver.OnGlobalLayoutListener listener){
if (Build.VERSION.SDK_INT < 16) {
    v.getViewTreeObserver().removeGlobalOnLayoutListener(listener);
} else {
    v.getViewTreeObserver().removeOnGlobalLayoutListener(listener);
}

}

我建議你查一下:

if (myLayout.getHeight()>0 && myLayout.getWidth()>0) {
// Do some code...
removeOnGlobalLayoutListener(..)
}

onActivityCreated ,視圖尚未測量。

所以不,你不能從那里得到測量結果。 onGlobalLayout是一個很好的地方。 布局在測量后直接發生。

如果您只想執行一次,則可以在之后刪除您的偵聽器。 請注意,布局可以改變大小(例如,出現軟鍵盤)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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