Android получает высоту и ширину макета в фрагменте

Я работаю над фрагментом, и хочу получить размер layout, содержащийся в xml fragment layout. Когда я пытаюсь выполнить код

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

он возвращает 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);
         }
});

но этот код вызывает много времени, и я точно не знаю, когда он выполняется. Мне нужны эти измерения в метод public void onActivityCreated (). Является ли это возможным?

Ответ 1

Для этого есть более чистое решение, просто используйте метод 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;
}

Очень аккуратно и аккуратно, без грязного просмотра с ViewTreeObserver.

Я проверял это только на устройствах Android-23, но API был этот метод с уровня 1.

Во всяком случае, WFM.

Ответ 2

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

}

Я бы предложил вам проверить:

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

Ответ 3

В onActivityCreated вид еще не измерен.

Нет, вы не можете получить измерения оттуда. onGlobalLayout - хорошее место для этого. Макеты происходят непосредственно после измерения.

После этого вы можете удалить своего слушателя, если хотите сделать это один раз. Обратите внимание, что макеты могут изменять размер (например, появляются мягкие клавиатуры)