Android get layout height and width in a fragment

倖福魔咒の 提交于 2019-11-29 06:13:52

问题


I am working on a fragment and I want to get the dimension of a layout contained in the xml fragment layout. When I try the code

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

it returns 0. I need these dimensions to put inside myLayout other objects.

I try to use:

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

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

but this code is invoke a lot of time and I don't know exactly when it is execute. I need these dimensions into public void onActivityCreated () method. Is it possible?


回答1:


There's a cleaner solution to this, just use the View.post() method on your fragment's root view, and you can call getMeasuredHeight()/getMeasuredWidth() and get the actual values.

E.g.

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;
}

Very neat and tidy and no messy mucking about with the ViewTreeObserver.

I've only tested this with android-23 devices, but the API has had this method since level 1.

Anyway, WFM.




回答2:


The addOnGlobalLayoutListener will be called whenever small change of the view happened. So you need to remove this listener from the view.

Simple usage:

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

}

I would suggest you to check :

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



回答3:


In onActivityCreated, the view hasn't been measured yet.

So no, you can't get the measurements from there. onGlobalLayout is a good place to do it. Layouts happen directly after measurement.

You can remove your listener afterwards, if you only want to do it once. Note that layouts can change size though (soft keyboards appearing, for example)



来源:https://stackoverflow.com/questions/16937953/android-get-layout-height-and-width-in-a-fragment

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!