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?
- Android mapview con fragmentos no se puede agregar dos veces?
- Tamaño de imagen dinámico para android
- cargar pdf desde url en android
- Medición de la altura del texto a dibujar en lienzo (Android)
- RecyclerView con elementos personalizados
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.
- Diferencia entre vista y subvista - Android
- Obtener ids de vista en un bucle for por programa?
- Android ClassCastException al recuperar Vista personalizada
- WebViewClient no se puede resolver con un tipo
- Transferir el enfoque táctil a otra vista
- Diferencia entre View y ViewGroup en Android
- ¿Cómo puedo determinar si una aplicación de Android se ha creado con una vista web?
- Cómo desplegar una parte de la imagen en android
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 /
- Problema de AnimationSet en android
- Android: cómo montar el sistema de archivos en RW desde mi APK? (Arraigado, por supuesto)