android android-layout android-fragments android-linearlayout android-context

android - Cómo extender LinearLayout correctamente para crear una vista personalizada



android-layout android-fragments (1)

Tengo alguna "tarjeta", que es un LinearLayout simple con un TextView dentro

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

luego tengo mi Fragmento principal con un LinearLayout vertical y en este fragmento principal agrego estas "tarjetas" al diseño principal:

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

esto funciona muy bien Y mi tarjeta llena todo el ancho del diseño del fragmento. En realidad lo que estoy esperando.

Ahora creé una Clase separada para mi Tarjeta:

Class Card extends LinearLayout{ public Card(Context context) { super(context); View view = LayoutInflater.from(getContext()).inflate( R.layout.card, null); this.addView(view); } }

Y luego, si agrego mi tarjeta a la distribución del fragmento principal de la forma:

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

luego se agrega PERO el ancho de la tarjeta ya no se llena, sino que se ajusta a la vista de texto.

¿Podría alguien explicarme por qué obtengo diferentes tamaños de ancho con estos dos métodos para agregar los mismos diseños?

La solución aquí se cambia Clase de tarjeta que resuelve este problema:

public Card(Context context) { super(context); LayoutInflater.from(getContext()).inflate( R.layout.card, this); } }


Esa no es la forma correcta de implementar una clase de vista personalizada. En su implementación de la clase de Tarjeta, en realidad está creando un LinearLayout adicional que no es necesario.

Primero, implemente su clase de tarjeta que amplíe LinearLayout. Luego, haz referencia en tu diseño XML como:

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

Aquí hay un buen tutorial sobre cómo crear vistas personalizadas en Android.