2011-05-27 3 views
0

Greets. Je suis en train de travailler sur un projet et j'ai pensé que j'allongerais un composant composite. Je les ai disposés en XML et j'ai écrit une nouvelle classe qui étend LinearLayout. Fondamentalement, j'ai besoin de cinq ou six d'entre eux dans une activité. Je veux créer ceux-ci à l'intérieur d'une activité par programme parce que je ne sais pas combien je vais avoir besoin avant l'exécution. Aussi, j'ai créé un fichier XML pour les mettre en place que je n'ai pas inclus ci-dessous. J'ai un problème avec chacune des méthodes que j'ai trouvé pour le faire.Composant Android composite créé au moment de l'exécution

Voici les segments de méthode à l'intérieur de la classe I fait qui s'étend LinearLayout:

public ExtendedLinearLayout(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    ... 
} 

@Override 
protected void onFinishInflate() { 
    super.onFinishInflate(); 
    ((Activity)getContext()).getLayoutInflater().inflate(R.layout.extended_linear_layout, this); 
    ... 
} 

Et à l'intérieur de l'activité, ce sont les deux solutions qui semblent être le plus proche de ce que je cherche.

Je ne sais pas où trouver les attrs d'utiliser cette méthode:

ExtendedLinearLayout customViewClass = new ExtendedLinearLayout(this, attrs); 
layout.addView(customViewClass) 

Ne pas savoir comment spécifier que le gonfleur doit utiliser le ExtendedLinearLayout avec cette méthode:

LayoutInflater inflater = LayoutInflater.from(this); 
inflater.inflate(R.layout.extended_linear_layout, parent_layout); 

Je vais probablement se contenter d'utiliser un ListView - mais il semble un peu exagéré pour cinq à six éléments. En outre, après avoir travaillé avec Flex avant, cela au moins semble comme une solution raisonnable au problème.

Merci, Randall

---------------- ------------------- MISE À JOUR

J'ai essayé la méthode décrite ci-dessous. Une fois que j'ai tout mis en place, je reçois une InflationException: ligne de fichier XML binaire # 8: Erreur de gonflement de la classe. Je sentir comme le xml semble très bien. Une chose que je peux être confus est de savoir où appeler l'inflateur. En ce moment, j'appelle le gonfleur dans onFinishInflate() de la classe personnalisée, ainsi que dans l'activité comme suit:

public class ExtendedLinearLayout extends LinearLayout { 
    ... 
public ExtendedLinearLayout(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     this.context = context; 
    } 

    @Override 
    protected void onFinishInflate() { 
     super.onFinishInflate(); 
     LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     inflater.inflate(R.layout.extended_linear_layout, null); 
     ... 
    } 
} 

Et dans l'activité:

public class TestActivity extends Activity { 
    LinearLayout list; 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     list = (LinearLayout) findViewById(R.id.simple_list); 
     runTestCode(); 
    } 
    private void runTestCode() { 
     LayoutInflater inflater = (LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     ExtendedLinearLayout layoutOne = 
       (ExtendedLinearLayout) inflater.inflate(R.layout.extended_linear_layout, list); 
    } 
} 

Merci et vous espérez » J'ai le temps de jeter un coup d'oeil. J'aime faire des trucs en creusant en ligne mais celui-ci m'a fait cuire pendant un certain nombre d'heures depuis hier matin. Je suis à environ 2 pouces de refactoring juste dans un ListAdapter.

MISE A JOUR ------------------- ----------------

Voici le fichier xml

<?xml version="1.0" encoding="utf-8"?> 
<com.anotherandroidblog.ExtendedLinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="horizontal" 
    > 
    <TextView 
     android:id="@+id/text_one" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     android:text="" 
     ></TextView> 
    <TextView 
     android:id="@+id/text_two" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     android:text="" 
     ></TextView> 
    <TextView 
     android:id="@+id/text_three" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_weight="2" 
     ></TextView> 
</com.anotherandroidblog.ExtendedLinearLayout> 

Répondre

0

Vous devez utiliser le nom complet de la classe dans le fichier XML: au lieu de faire l'élément racine LinearLayout rendre le nom complet de classe pour ExtendedLinearLayout (y compris le nom de package). Ensuite, le LayoutInflater saura quoi faire.

EDIT: aussi, l'option attrs n'est pas vraiment réalisable (ou du moins je ne pense pas). Je n'ai pas trouvé un moyen de générer au moment de l'exécution l'instance d'objet attrs: il n'y a pas de constructeur public et je pense que c'est une autre des choses que le framework fait sous le capot qui n'est pas accessible.

+1

Génial, merci pour la réponse super rapide de style ninja. Je vais rouler ça et vous laisser savoir comment ça se passe dans quelques-uns. En outre, d'après ce que j'ai lu (y compris une réponse de Romain Guy sur un post similaire), vous devriez toujours utiliser la méthode inflatable par rapport à la méthode addView(). – javahead76

+0

J'ai couru plusieurs fois en train de bouger et de creuser pour bien faire les choses. J'attrape une InflaterException qui, je pense, est liée à quand et comment j'appelle le gonfleur. J'ai ajouté une mise à jour à la publication originale ci-dessus. – javahead76

+0

Ajoutez également la mise en page XML afin que je puisse voir à quoi il ressemble. – Femi

Questions connexes