2014-12-26 2 views
1

im пытается измерить ImageView, после того, как мой фрагмент отображается или, если возможно, раньше.getHeight во фрагменте

Я слышал, что его еще не возможно в onActivityCreated. Но как-то он работает с глобальным слушателем макета. -Но как? -У меня есть метод, который измеряет и делает какой-то код, я просто не знаю, когда вызывать метод.

Может ли кто-нибудь нарисовать пример?

начало метода измерения:

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

Спасибо!

ответ

3

Чтобы установить GlobalLayoutListener вы должны получить ViewTreeObserver из ваших View с помощью метода view.getViewTreeObserver(), который:

Возвращает ViewTreeObserver для иерархии этого вида. Наблюдатель дерева представлений может использоваться для получения уведомлений, когда происходят глобальные события, например макет.

После этого, что хорошо, вы можете addOnGlobalLayoutListener на вашем ViewTreeObserever

OnGlobalLayoutListener: определение интерфейса для обратного вызова, которая будет вызвана, когда глобальное состояние макета или видимость позиций в рамках изменений в виде дерева.

и внутри метода onGlobalLayout вы можете вызвать getWidth на нужную точку зрения, вот пример:

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

Надеется, что это помогает.

+1

Спасибо, он был действительно полезен! – Botti560