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