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

lor*_*105 18 layout android fragment dimension

我正在研究一个片段,我想得到一个layout包含在其中的维度xml fragment layout.当我尝试代码时

RelativeLayout myLayout = view.findViewById(R.id.myLayout);
myLayout.getHeight();
Run Code Online (Sandbox Code Playgroud)

它返回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);
         }
});
Run Code Online (Sandbox Code Playgroud)

但是这段代码调用了很多时间,我不确切知道它何时执行.我需要将这些尺寸转化为 public void onActivityCreated ()方法.可能吗?

小智 24

有一个更清晰的解决方案,只需在片段的根视图上使用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;
}
Run Code Online (Sandbox Code Playgroud)

使用ViewTreeObserver非常干净整洁,没有杂乱无章.

我只用android-23设备对它进行了测试,但是从1级开始,API已经有了这个方法.

无论如何,WFM.


Udi*_*shi 10

只要发生小的视图更改,就会调用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);
}
Run Code Online (Sandbox Code Playgroud)

}

我建议你查一下:

if (myLayout.getHeight()>0 && myLayout.getWidth()>0) {
// Do some code...
removeOnGlobalLayoutListener(..)
}
Run Code Online (Sandbox Code Playgroud)


Bra*_*ell 2

在 中onActivityCreated,视图尚未测量。

所以不,你无法从那里获得测量结果。onGlobalLayout是一个这样做的好地方。测量后立即进行布局。

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