Cómo extender la etiqueta de inclusión en Android

Terminé teniendo muchos archivos xml compartiendo el mismo código en el encabezado y el pie de página. ¿Hay alguna buena manera de crear algún tipo de plantilla y pasarle un recurso para incluir en el medio?

En otras palabras, ¿cómo extender la etiqueta de inclusión de tal manera que podría, en lugar de simplemente incluir una vista, incluir una plantilla que incluye el recurso dado?

Mi código desordenado:

<?xml version="1.0" encoding="utf-8"?> <include layout="@layout/settings_section" /> 

Settings_section.xml:

 <?xml version="1.0" encoding="utf-8"?> <!--Header Begin--> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" android:padding="10dp" > <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@layout/my_shape" android:orientation="vertical" ><include layout="@layout/header" /> <!--End header--> <TextView android:layout_width="fill_parent" android:layout_height="fill_parent" android:padding="10dp" android:text="Blah blah blah" /> <!--Footer Begin --> </LinearLayout> </LinearLayout> <!-- Footer End --> 

Lo que me gustaría:

 <include layout="@layout/header" /> <com.example.Include layout="@layout/settings_section" inside="@layout/default_template" /> 

EDIT : Estoy buscando muestras de código.

Esto no responde exactamente a su pregunta, pero he usado estilos para situaciones similares.

Res / layout / layout.xml:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" style="@style/header1" > <LinearLayout style="@style/header2" > <include layout="@layout/header" /> ... 

Res / values ​​/ styles.xml

 ... <style name="header1"> <item name="android:layout_width">fill_parent</item> <item name="android:layout_height">fill_parent</item> <item name="android:orientation">vertical</item> <item name="android:padding">10dp</item> </style> <style name="header2"> <item name="android:layout_width">fill_parent</item> <item name="android:layout_height">fill_parent</item> <item name="android:background">@layout/my_shape</item> <item name="android:orientation">vertical</item> <style> ... 

De todos modos, este enfoque simplifica las partes que tiene que copiar / pegar en varios archivos y hace que la modificación sea más sencilla y flexible. Puede hacer modificaciones dentro de layout.xml si es necesario – los valores que da en los estilos se sobrescriben – y modificar el estilo afecta a todos los diseños que los utilizan.

Sólo una idea: dentro de settings_section xml me gustaría crear un contenedor (un LinearLayout ) con id. Entonces en Activity.onCreate() encontraría ese contenedor por su id y agregaría un child ( default_template ) a él.

Entonces crearía algún tipo de YourBaseActivity con un método protected addContent(int contentId) , por lo que el código para encontrar un contenedor e insertar un contenido en él no se repite en otras actividades similares.

Si desea que el comportamiento descrito sea posible, tendrá que crear una clase de vista personalizada que amplíe LinearLayout (consulte Creación de componentes personalizados) . Cuando se crea esta vista, puede obtener los atributos especificados en el XML (consulte Pasar variables personalizadas a través de recursos XML ) e inflar estos recursos.

La configuración de XML se vería como

 <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@layout/my_shape" android:orientation="vertical" ><include layout="@layout/header" /> <!--End header--> <TextView android:layout_width="fill_parent" android:layout_height="fill_parent" android:padding="10dp" android:text="Blah blah blah" /> <!--Footer Begin --> </LinearLayout> 

Tenga en cuenta que me he librado de la más externa LinearLayout para el contenido ya que su vista personalizada será un tipo de LinearLayout todos modos. Si tengo tiempo voy a golpear una vista DoubleInclude más tarde y publicar el código.

Aquí hay una plantilla xml

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/myviewHeader" android:layout_height="wrap_content" android:layout_width="fill_parent" > </TextView> <LinearLayout android:id="@+id/myviewIncluder" android:layout_height="wrap_content" android:layout_width="fill_parent" > </LinearLayout> <TextView android:id="@+id/myviewFooter" android:layout_height="wrap_content" android:layout_width="fill_parent" > </TextView> </LinearLayout> 

Y una Clase para un ViewGroup con contenido dinámico

 import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.LinearLayout; import android.widget.TextView; public class MyView extends ViewGroup { private LayoutInflater mInflater; private TextView header; private TextView footer; public MyView(Context context,View child) { super(context); mInflater = LayoutInflater.from(context); mInflater.inflate(R.layout.myview, this); LinearLayout includer = (LinearLayout) findViewById(R.id.myviewIncluder); header = (TextView) findViewById(R.id.myviewHeader); footer = (TextView) findViewById(R.id.myviewFooter); includer.addView(child); } @Override protected void onLayout(boolean arg0, int arg1, int arg2, int arg3, int arg4) { // TODO Auto-generated method stub } public void set_HeaderText(String text){ header.setText(text); } public void set_FooterText(String text){ footer.setText(text); } } 

Si quieres añadir una vie en la parte Includer, yozu puede actuar así:

  View include = null; LayoutInflater mInflater = LayoutInflater.from(this); include = mInflater.inflate(R.xml.list_item_icon_text,null); ViewGroup text = new MyView(this,include); 

El sistema de compilación predeterminado de Eclipse no es muy flexible de lo que he visto, pero si estás dispuesto a ir con Ant para tu sistema de compilación, puedes hacer mucho más en tiempo de construcción como generar archivos XML. Eclipse puede usar Ant para construir el proyecto en lugar de su propio sistema de compilación, ya que es común para algunos proyectos. Al generar los archivos XML en tiempo de compilación en lugar de runtime como @Arhimed sugirió, tiene la ventaja de ver el origen XML de archivo y de representarlo en Eclipse para asegurarse de que se vea correcto. Este enfoque es un poco más avanzado, pero ofrece mucha más flexibilidad. Una vez que esté usando Ant, también puede hacer otras cosas como generar dos versiones de una aplicación con diferentes configuraciones, como una versión de pago y una versión de lite. Aquí está la introducción de Ant a FilterChains: http://ant.apache.org/manual/Types/filterchain.html y un documento sobre el uso de Ant para aduanas construye un Android apk: http://blog.elsdoerfer.name/2010/04 / 29 / android-build-multiple-versions-of-a-project /

  • Cómo establecer el atributo de primer plano en otra vista no FrameLayout
  • Arrastrar y soltar iconos a la pantalla de inicio
  • Las vistas agregadas dinámicamente desaparecen en orientación en Android
  • Android Canvas.drawTextOnPath no parece correcto cuando la pintura se establece en Stroke
  • RemoveView no funciona después de LayoutInflater.inflate (resource, root, true)
  • Android ExpandableListView y onChildClick no funciona
  • Los métodos getTop (), getLeft (), getX (), getY (), getWidth (), getHeight () de la vista de Android
  • El fondo de la vista ampliable se vuelve negro cuando se amplía
  • Surface - dequeueBuffer failed (Error desconocido 2147483646)
  • Android notifyDataSetChanged para ExpandableListView no funciona
  • Custom ExpandableListview Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.