Android get layout height and width in a fragment

lory105 picture lory105 · Jun 5, 2013 · Viewed 28.1k times · Source

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?

Answer

Staffan picture Staffan · Feb 25, 2016

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.