2013-09-04 6 views
6

Ich habe festgestellt, dass die Ansicht meiner Anwendung 0 für getWidth() und getHeight() zurückgibt, nachdem onMeasure() bereits aufgerufen wurde. Dies geschieht nur auf einer Handvoll Geräte, für die meisten Android-Geräte funktioniert der folgende Code gut. Meine checkViewAndLoad() - Funktion lädt eine skalierte Bitmap abhängig von der Größe der Ansicht.getWidth() und getHeight geben null nach onMeasure() (spezifische Geräte) zurück

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

Hier ist ein Protokoll einer Vorrichtung (Motorola Droid Razr Maxx), die Null für getWidth zurück()/getHeight() nach 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 

ich setMeasuredDimensions auch versucht() manuell, aber diese Hand keinen Einfluss auf die Protokolle.

Kann mir jemand sagen, was ich hier falsch mache oder wie man die Breite/Höhe einer SurfaceView nach dem Aufruf von onMeasure() bekommt?

Antwort

9

Verwenden Sie getMeasuredWidth/Height() hier. getWidth/Height() sind erst nach einem Layout gültig.

1

Auf diese Weise versuchen

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

} 
Verwandte Themen