Android获取片段中的布局高度和宽度

Android获取片段中的布局高度和宽度,android,layout,fragment,dimension,Android,Layout,Fragment,Dimension,我正在处理一个片段,我想获得xml片段布局中包含的布局的维度。 当我尝试代码时 RelativeLayout myLayout = view.findViewById(R.id.myLayout); myLayout.getHeight(); 它返回0。 我需要这些尺寸来放置我的布局和其他对象 我尝试使用: myLayout.getViewTreeObserver().addOnGlobalLayoutListener( new ViewTreeObserver.OnGlobalLa

我正在处理一个片段,我想获得
xml
片段布局中包含的
布局的维度。
当我尝试代码时

RelativeLayout myLayout = view.findViewById(R.id.myLayout);
myLayout.getHeight();
它返回0。 我需要这些尺寸来放置我的布局和其他对象

我尝试使用:

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

        @Override
        public void onGlobalLayout() {
            mHeight = myLayout.getHeight();  
            mWidth= myLayout.getWidth();
            System.out.println("width: "+mWidth+"   height: "+mHeight);
         }
});
但是这段代码需要调用很多时间,我不知道它是在什么时候执行的。
我需要将这些维度放到activitycreated()方法的
public void中。可能吗

在创建的活动中,尚未测量视图

所以不,你不能从那里得到测量值
onGlobalLayout
是一个很好的地方。布局在测量之后直接发生


如果只想删除一次侦听器,可以在以后删除它。请注意,布局可以改变大小(例如,出现软键盘)

只要视图发生微小更改,就会调用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);
}

有一个更简洁的解决方案,只需在片段的根视图上使用
View.post()
方法,您就可以调用
getmeasuredheath()/getMeasuredWidth()
并获取实际值

例如

非常整洁,没有乱七八糟地乱搞
ViewTreeObserver

我只在android-23设备上测试过这种方法,但API从1级开始就有了这种方法


无论如何,WFM。

什么是myLayout..提到codeIt是XMLpost myLayout xml文件中声明的相对布局的引用,您找到了任何解决方案吗?如果您需要从fragment类而不是从activity@FernandoGallego否,在创建的视图中,宽度和高度返回0。
if (myLayout.getHeight()>0 && myLayout.getWidth()>0) {
// Do some code...
removeOnGlobalLayoutListener(..)
}
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;
}