Search code examples
androidandroid-fragmentsandroid-lifecyclemeasure

getHeight in a fragment


im trying to measure a ImageView, after my fragment is displayed, or if possible before.

I heared, that its not yet possible in the onActivityCreated. But somehow it works with the global Layout listener. -But how? -I have a method, wich measures and does some code, i just don't know when to call the method.

Can somebody gice an example?

the beginning of the measure method:

 public void skalierung() {
		
		InputStream dots=getResources().openRawResource(R.drawable.amountofdots);
		Bitmap dotsBmp = BitmapFactory.decodeStream(dots);
		
		View mainframe=(View)getActivity().findViewById(R.id.mainframe);
		int breite=mainframe.getWidth();

Thanks!


Solution

  • To set a GlobalLayoutListener you have to get ViewTreeObserverof your View using the view.getViewTreeObserver() method which :

    Returns the ViewTreeObserver for this view's hierarchy. The view tree observer can be used to get notifications when global events, like layout, happen.

    After doing that well , you can addOnGlobalLayoutListener on your ViewTreeObserever

    OnGlobalLayoutListener : Interface definition for a callback to be invoked when the global layout state or the visibility of views within the view tree changes.

    and inside the onGlobalLayoutmethod you can call the getWidth on the your desired view, here's an example :

        View mainframe=(View)getActivity().findViewById(R.id.mainframe);
    ViewTreeObserver vto = mainframe.getViewTreeObserver();
    vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
    
        @Override
        public void onGlobalLayout() {
            skalierung(); // here you can call the getWidth and getHeight methods
            ViewTreeObserver obs = mainframe.getViewTreeObserver();
    
            // you have to reset the ViewTreeObserver each time to ensure the reuse of the OnGlobalLayoutListener
    
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                obs.removeOnGlobalLayoutListener(this);
            } else {
                obs.removeGlobalOnLayoutListener(this);
            } 
         }
        });
    

    Hope it helps.