2011-06-21 11 views
16

Jak obliczyć szerokość i wysokość zawyżonego widoku, jeśli rodzic jest PopupWindow, a nie ViewGroup? Nie mogę korzystać LayoutInflator.inflate(int resId, ViewGroup parent, attachToRoot boolean) ponieważ PopupWindow nie jest ViewGroup, więc używam LayoutInflator.inflate(int resId) zamiast, ale potem ja getWidth() i getHeight() zwraca zerowy :(Jak uzyskać lub obliczyć szerokość/wysokość nadmuchanego widoku?

muszę zmienić rozmiar PopupWindow dopasować widok, ale nie może zrobić tak dopóki View ma rodzica. Czy mam problem z kurczaka i jaj?

Nawiasem mówiąc widok jest podklasą RelativeView więc obliczenie to ręcznie jest zasadniczo wykluczone.

Dzięki z advance, Barry

+0

jesteś w stanie dostać się do wymiarów Państwa zdanie po wywołaniu 'LayoutInflator.inflate (int resid, ViewGroup rodzic , attachToRoot boolean) '? –

Odpowiedz

17

Właściwie popupWindow obsługuje "content wrap" constans, więc jeśli chcesz być dokładny jako podręczne widoku - użyj tego:

popup = new PopupWindow(context); 
popup.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT); 
popup.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT); 

- inne opcje -

getWidth() i getHeight() zwraca zero, ponieważ widok ma rozmiar tylko po rysowaniu na ekranie. Możesz spróbować uzyskać wartości od LayoutParams z zawyżonego widoku.

Jeśli jest wartość fill_parent - jesteś w sytuacji jajo-kurczaka.

Jeśli nie ma wartości w px lub dp można ręcznie obliczyć rozmiar w pikselach:

Math.round(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dpSize, context.getResources().getDisplayMetrics())); 

Jeśli istnieje wrap_content wartość - można użyć view.measure() metodę - dzieci i wyświetlać się będą mierzone, a ty można uzyskać view.getMeasuredHeight() i view.getMeasuredWidth().

+0

Tak używam fill_parent. Zlikwidowałem przy użyciu obliczonej wartości dla rozmiaru PopupWindow (szerokość wyświetlania - dopełnienie). Działa wystarczająco dobrze. –

-3

Proszę spróbować tego:

Display display = getWindowManager().getDefaultDisplay(); 
Log.e("", "" + display.getHeight() + " " + display.getWidth()); 
+1

Potrzebuję szerokości i wysokości mojego widoku, a nie wyświetlacza. –

+1

Szukałem tego, dzięki! – paiego

+1

To nie odpowiada na pytanie o OP – Gerard

6

Jak powiedział Jin35, problem polegał na tym, że szerokość i wysokość widoku nie zostały jeszcze obliczone ... wymiary nie są obliczane przed przejściem układu.

Użycie stałej szerokości i wysokości z zasobów wymiaru (np. Z pliku values ​​/ dimens.xml) jest jednym obejściem, ponieważ nie trzeba czekać na wystąpienie zdarzenia onMeasure - można uzyskać wartość z tego samego zasobu wymiaru, który był używany w widoku, który Cię interesuje, i użyj go.

Lepszym rozwiązaniem jest po prostu opóźnić obliczenia, aż do momentu, gdy zdarzy się zdarzenie. Można to zrobić poprzez nadpisanie onMeasure, ale bardziej eleganckim rozwiązaniem jest użycie tymczasowej OnGlobalLayoutListener takiego:

View popup = LayoutInflator.inflate(int resId); 
if(popup != null) { 

    // set up an observer that will be called once the listView's layout is ready 
    android.view.ViewTreeObserver viewTreeObserver = listView.getViewTreeObserver(); 
    if (viewTreeObserver.isAlive()) { 

     viewTreeObserver.addOnGlobalLayoutListener(new android.view.ViewTreeObserver.OnGlobalLayoutListener() { 

      @Override 
      public void onGlobalLayout() { 

       //Log.v(TAG, "onGlobalLayoutPondYouOldPoop"); 

       // This will be called once the layout is finished, prior to displaying. 

       View popup = findViewById(resId); 

       if(popup != null) { 
        int width = popup.getMeasuredWidth(); 
        int height = popup.getMeasuredHeight(); 

        // don't need the listener any more 
        popup.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
       } 
      } 
     }); 
    } 
} 
Powiązane problemy