2010-07-27 2 views
2

Mon main.xml ressemble à ceci:Est-ce que /res/layout/main.xml décrit une vue ou un ViewGroup?

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
> 
<TextView 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/hello" 
/> 
</LinearLayout> 

Depuis l'élément racine est un LinearLayout, qui étend ViewGroup, pourquoi ne main.xml transformer en un View au lieu d'un ViewGroup? Par exemple, dans ma classe principale Activity, j'essaie d'obtenir le nombre de sous-vues que le LinearLayout contient comme ceci:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    ViewGroup vg = (ViewGroup) findViewById(R.layout.main); 
    Log.v("myTag", "num children: " + vg.getChildCount()); 

mais il se bloque lorsque j'appelle vg.getChildCount().

Quelle est la bonne façon de le faire?

+0

Avez-vous jeté un oeil à la LogCat pour l'exception? Les développeurs Android ont fait un très bon travail de vous faire savoir ce qui n'a pas fonctionné avec les exceptions qu'ils distribuent. –

Répondre

6

findViewById est supposé prendre l'ID d'une vue définie à l'intérieur un fichier XML de mise en page, pas l'ID du fichier lui-même. Une fois que vous avez gonflé la vue, que ce soit manuellement ou via setContentView, vous pouvez obtenir la mise en page avec, si vous l'aviez fait de cette façon:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:id="@+id/mainlayout" 
> 
<TextView 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/hello" 
/> 
</LinearLayout> 

Par:

ViewGroup vg = (ViewGroup) findViewById(R.id.mainlayout); 

Notez l'ajout d'un android:id et l'utilisation de la valeur R.id correspondante dans l'appel findViewById. C'est la même utilisation que celle décrite dans le Dev Guide. Vous devriez alors être en mesure de lancer le résultat en toute sécurité dans un ViewGroup ou LinearLayout.

Si, par hasard, vous souhaitez charger la vue principale séparément, par ex. en tant que sous-vue, utilisez getLayoutInflater(). inflate(...) pour créer et récupérer.

+0

Fonctionne super bien .. Merci –

Questions connexes