15

ho qualche "carta", che è un semplice LinearLayout con un TextView all'internoCome estendere correttamente LinearLayout per creare una visualizzazione personalizzata

<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> 

poi ho il mio principale Frammento con un LinearLayout verticale .. e in questo frammento principale per cui ho aggiungere questo "carte" per il layout 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); 

questo funziona molto bene e la mia carta riempie tutta la larghezza del layout di frammento. In realtà quello che mi aspetto.

Ora ho creato una classe separata per la mia carta:

Class Card extends LinearLayout{ 

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

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

     this.addView(view); 

    } 
} 

E, se poi aggiungo la mia carta al layout frammento principale nel modo:

# 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()); 

allora viene aggiunto MA la larghezza della carta non è più piena, ma avvolta nella vista testo.

Qualcuno potrebbe spiegarmi perché ottengo diverse larghezze con questo metodo di aggiungere gli stessi layout?

Soluzione classe qui è cambiato scheda che risolve questo problema:

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

     LayoutInflater.from(getContext()).inflate(
       R.layout.card, this); 
    } 
} 
+0

Sei sicuro che il vostro 'Card' cambiato la larghezza e non' LinearLayout'? – eleven

+0

si. Ho semplificato la domanda per una migliore comprensione, poiché sto lavorando con cose più complesse. Ma il fatto è che aggiungendo la "carta" direttamente al layout e tramite una nuova classe, si ottengono risultati diversi. Presumo che aggiungendo tramite la nuova classe la larghezza del layout genitore non possa essere verificata in qualche modo. – user1908375

risposta

15

Questo non è il modo corretto per implementare una visualizzazione personalizzata di classe. Nella tua implementazione della classe Card, stai effettivamente creando un LinearLayout aggiuntivo che non è necessario.

Innanzitutto, implementare la classe Card che estende LinearLayout. Poi, fare riferimento a esso nel layout XML come ad esempio:

<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> 

Here's a good tutorial on creating custom views in android.

Problemi correlati