繁体   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