2013-09-04 9 views
6

Zauważyłem, że widok mojej aplikacji zwraca 0 dla getWidth() i getHeight() po tym, jak onMeasure() został już wywołany. Dzieje się tak tylko na kilku urządzeniach, dla większości urządzeń z Androidem poniższy kod działa dobrze. Moja funkcja checkViewAndLoad() ładuje skalowaną bitmapę w zależności od rozmiaru widoku.getWidth() i getHeight zwracają zero po onMeasure() (określone urządzenia)

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    super.onMeasure(widthMeasureSpec, heightMeasureSpec); 

    Log.d("widthMeasureSpec", Integer.toString(MeasureSpec.getSize(widthMeasureSpec))); 
    Log.d("heightMeasureSpec", Integer.toString(MeasureSpec.getSize(heightMeasureSpec))); 
    Log.d("viewWidth", Integer.toString(getWidth())); 
    Log.d("viewHeight", Integer.toString(getHeight())); 

    checkViewAndLoad(); 
} 

Oto log z urządzeniem (Motorola Droid Razr Maxx), która zwraca zero dla getWidth()/getHeight() po onMeasure():

09-03 20:55:58.359: D/widthMeasureSpec(29496): 540 
09-03 20:55:58.359: D/heightMeasureSpec(29496): 720 
09-03 20:55:58.359: D/viewWidth(29496): 0 
09-03 20:55:58.359: D/viewHeight(29496): 0 

ja również próbował setMeasuredDimensions() ręcznie, ale ta ręka nie wpływa na logi.

Czy ktoś może mi powiedzieć, co robię źle tutaj, lub jak uzyskać szerokość/wysokość SurfaceView po nazwie onMeasure()?

Odpowiedz

9

Użyj tutaj getMeasuredWidth/Height() tutaj. getWidth/Height() są nieprawidłowe dopiero po układzie.

1

Spróbuj ten sposób

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    super.onMeasure(widthMeasureSpec, heightMeasureSpec); 

setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.getSize(heightMeasureSpec)); 

    Log.d("widthMeasureSpec", Integer.toString(MeasureSpec.getSize(widthMeasureSpec))); 
    Log.d("heightMeasureSpec", Integer.toString(MeasureSpec.getSize(heightMeasureSpec))); 
    Log.d("viewWidth", Integer.toString(getWidth())); 
    Log.d("viewHeight", Integer.toString(getHeight())); 

    if(getMeasuredWidth()!=0 && getMeasuredHeight()!=0){ 
       checkViewAndLoad(); 
    } 

} 
Powiązane problemy