2010-01-13 7 views
9

J'ai créé une classe qui étend une vue:getLayoutParams retourne null?

public class BoardView extends View { 

et j'ai spécifié la largeur et la hauteur du BoardView dans le fichier main.xml de l'application:

<mypackage.BoardView 
     android:id="@+id/board"   
     android:layout_width="270px" 
     android:layout_height="270px" /> 

Je suis essayer d'obtenir la largeur et la hauteur à partir d'une fonction appelée depuis le constructeur de BoardView. Voici ce que je suis en train de faire:

ViewGroup.LayoutParams p = this.getLayoutParams(); 
int h = p.height; 

mais getLayoutParams renvoie toujours la valeur null. Une idée de pourquoi cela ne fonctionne pas?

Répondre

13

Je ne suis pas sûr que les paramètres de disposition (c'est-à-dire l'instance de LayoutParams) seront disponibles dans le constructeur de la vue. Je pense, il ne sera disponible qu'après la "mise en page" des passes ont été faites. Lire à propos de How Android draws views here. En outre, this thread essaie de déterminer exactement quand vous devriez obtenir des dimensions mesurées d'une vue.

Notez que si vous souhaitez simplement obtenir les valeurs d'attribut transmises via la mise en page XML, vous pouvez utiliser l'instance AttributeSet transmise en tant qu'argument à votre constructeur.

public MyView(Context context, AttributeSet attrs){ 
// attrs.getAttributeCount(); 
// attrs.getAttributeXXXvalue(); 
} 
+2

Merci pour l'aide. Tout ce dont j'avais vraiment besoin était la valeur d'attribut XML que je pouvais obtenir à partir de l'attribut AttributeSet du constructeur. Voici ma (moche) solution: Chaîne ns = "http://schemas.android.com/apk/res/android"; Chaîne v = attrs.getAttributeValue (ns, "layout_height"); // Convertir "270px" en "270" v = v.replace ("px", ""); // Au moment de l'exécution, cette valeur est "270,0" v = v.replace (". 0", ""); int h = Entier.parseInt (v); – tronman

14

Une fois la fonction est ajoutée à son parent les paramètres de mise en page sont disponibles. Essayez de déplacer votre code du constructeur de vue à onAttachedToWindow() car getLayoutParams() ne renverra pas null là.

@Override 
protected void onAttachedToWindow() { 
    super.onAttachedToWindow(); 
    assert getLayoutParams() != null; 
} 
Questions connexes