2013-06-04 3 views
16

In einem Fragment blähe ich ein Layout mit mehreren untergeordneten Ansichten auf. Ich muss die Dimensionen (Breite und Höhe) von einer von ihnen, die eine benutzerdefinierte Ansicht ist, erhalten.getWidth() und getHeight() geben immer 0 zurück. Benutzerdefinierte Ansicht

Innerhalb der benutzerdefinierten Ansicht Klasse kann ich es leicht tun. Aber wenn ich versuche, es aus dem Fragment zu machen, bekomme ich immer 0 als Dimensionen.

Ich denke, dass onViewCreated sollte der richtige Ort sein, um es zu bekommen, aber nun, das passiert. Ich habe es vor super.onViewCreated versucht, in debug sieht es aus wie 'findViewWithTag' findet die richtige Ansicht, nur mit api 7 v4-Unterstützung versucht.

Irgendwelche Hilfe?

Antwort

40

Sie erst nach dem ersten Takt und Layout, um für getWidth() und getHeight() Nicht-Null-Werte zu erhalten warten müssen. Sie können mit einem Sie müssen warten, ViewTreeObserver.OnGlobalLayouListener

public void onViewCreated(final View view, Bundle saved) { 
    super.onViewCreated(view, saved); 
    view.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
     public void onGlobalLayout() { 
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { 
       view.getViewTreeObserver().removeOnGlobalLayoutListener(this); 
      } else { 
       view.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
      } 

      // get width and height of the view 
     } 
    }); 
} 
+0

+1 danke :); removeGlobalOnLayoutListener ist heute bereits veraltet; aber das ist schon ein anderes Problem – quinestor

+0

Die veraltete Methode ruft durch die neue (und in der Tat weiß ich nicht, ob es wert war, nur wegen des Namens abzulehnen), aber ich habe meinen Code trotzdem bearbeitet. – Karakuri

+0

Oder überschreiben Sie einfach 'onSizeChanged()'. – Kerry

0

Versuchen in onWindowFocusChanged prüft und es sollte gültige Werte haben:

public void onWindowFocusChanged (boolean hasFocus) { } 

ich ein ähnliches Problem hatte, wo ich die Breite und Höhe eines Widgets bekommen musste und das war die Funktion, in der ich das Widget garantieren konnte berichtet, dass es die richtige Größe ist.

1

Versuchen Aufruf

culoide.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);

zuerst, dann versuchen Sie getWidth() und getHeight()

1

dies tun, bis die onSizeChanged() Methode aufgerufen wird, bevor Sie zuverlässig die Ansichtsgröße bestimmen kann.

Dies wird während des Layouts aufgerufen, wenn sich die Größe dieser Ansicht geändert hat. Wenn Sie nur zu der Ansicht Hierarchie hinzugefügt wurden, sind Sie mit den alten Werte von 0.

5

Meine bevorzugte Methode ist eine OnLayoutChangeListener zu der Ansicht hinzufügen, die Sie selbst verfolgen

CustomView customView = ... 

customView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { 
    @Override 
    public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { 
     // Make changes 
    } 
}); 
wollen genannt

Sie können den Listener im Callback entfernen, wenn Sie nur das ursprüngliche Layout möchten.