web-dev-qa-db-fra.com

Comment étendre correctement LinearLayout pour créer une vue personnalisée

J'ai une "carte", qui est un simple LinearLayout avec un TextView à l'intérieur

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:card="http://schemas.Android.com/apk/res-auto"
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
>
 <TextView
        Android:id="@+id/card_label_txt"
        Android:layout_width="wrap_content"
        Android:text="label" />
</LinearLayout>

alors j'ai mon fragment principal avec un LinearLayout vertical .. et dans ce fragment principal j'ajoute ces "cartes" à la disposition principale:

# main fragment layout
View view = inflater.inflate(R.layout.main_activity, null);
LinearLayout ll = (LinearLayout) view
                .findViewById(R.id.main_activity_ll);
# get card
View card = inflater.inflate(R.layout.card, null);

# add to fragment layout
ll.addView(card);

cela fonctionne très bien ET ma carte remplit toute la largeur de la disposition des fragments. En fait, ce que j'attends.

Maintenant, j'ai créé une classe distincte pour ma carte:

Class Card extends LinearLayout{

public Card(Context context) {
        super(context);

        View view =  LayoutInflater.from(getContext()).inflate(
                R.layout.card, null);

        this.addView(view);

    }
}

Et puis, si j'ajoute ma carte à la disposition du fragment principal de la manière:

# main fragment layout
View view = inflater.inflate(R.layout.main_activity, null);
LinearLayout ll = (LinearLayout) view
                .findViewById(R.id.main_activity_ll);

# add new Card to fragment layout
ll.addView(new Card(getActivity());

puis il est ajouté MAIS la largeur de la carte n'est plus remplie, mais enveloppée dans la vue texte.

Quelqu'un pourrait-il m'expliquer pourquoi j'obtiens des tailles de largeur différentes par ces deux méthodes pour ajouter les mêmes dispositions?

Solution ici est changé la classe de carte qui résout ce problème:

public Card(Context context) {
       super(context);

       LayoutInflater.from(getContext()).inflate(
                R.layout.card, this);
    }
}
16
user1908375

Ce n'est pas la bonne façon d'implémenter une classe View personnalisée. Dans votre implémentation de la classe Card, vous créez en fait un LinearLayout supplémentaire qui n'est pas nécessaire.

Tout d'abord, implémentez votre classe Card qui étend LinearLayout. Ensuite, référencez-le dans votre mise en page XML comme ceci:

<com.mypackagename.Card xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:card="http://schemas.Android.com/apk/res-auto"
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content" >
 <TextView
        Android:id="@+id/card_label_txt"
        Android:layout_width="wrap_content"
        Android:text="label" />
</com.mypackagename.Card>

Voici un bon tutoriel sur la création de vues personnalisées dans Android.

17
SBerg413