2010-07-07 19 views
26

Así que he creado una subclase de actividad llamada CustomTitlebarActivity. Esencialmente, cada actividad principal de mi aplicación tendrá una barra de título personalizada con muchas funciones comunes, como un botón de Inicio, un título, un botón de búsqueda, etc. En mi implementación actual, sigo usando explícitamente una declaración de inclusión en el formato XML para cada CustomTitlebarActivity:Android programáticamente incluye diseño (es decir, sin XML)

<include layout="@layout/titlebar" /> 

parece natural que debería ser capaz de hacer esto dentro de CustomTitlebarActivity. Tengo dos preguntas: ¿Qué código puede reemplazar esta etiqueta de inclusión y dónde debería poner el código? (Mi primer instinto sería ponerlo en el método setContentView de CustomTitlebarActivity.)

En una nota relacionada, agradecería una idea de mejores formas de reutilizar el código de la interfaz de usuario de Android (incluso si, per se, las barras de título deben variar ligeramente entre actividades).

Respuesta

14

Personalmente, probablemente me escriba mi Activity subclase a setContentView siempre a un archivo que contiene la disposición vertical fill_parentLinearLayout que contiene sólo mi barra de título: -

<LinearLayout android:id="@+id/custom_titlebar_container" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
    <!--titlebar here--> 
</LinearLayout> 

entonces me definen un resumen getContentAreaLayoutId() conocido hod en CustomTitlebarActivity que devuelve el diseño ID del contenido debajo de la barra de título para cada subclase; la base onCreate() de CustomTitlebarActivity entonces simplemente llamar

setContentView(R.layout.custom_titlebar_activity_frame_from_above); 
View.inflate(this, getContentAreaLayoutId(), findViewById(R.id.custom_titlebar_container)); 

Alternativamente, usted podría tener su método abstracto para conseguir el área de contenido devuelve una View en lugar de un int, dándole más flexibilidad para construir sus puntos de vista de forma dinámica (pero forzando para inflarlos usted mismo en el simple simplemente voltee este diseño XML aquí caso).

+0

Esta configuración hizo el truco, voy a experimentar más con él. ¿Alguna buena idea sobre cómo permitir una disposición variable de los botones de acción en este tipo de barra de título? –

+0

Eso depende, pero si hay una cantidad limitada de personalización bastante predecible (uno o dos botones/acciones personalizados) probablemente me quedo con el "método abstracto anulado por subclases para que la imagen use y la acción sea tomada" (como un abstract getFirstActionImageResourceId(), onFirstActionClicked()) y simplemente engancharlos en onCreate() de la clase base. –

49

Conocí este problema también, y acabo de resolverlo ahora. Creo que mi solución es fácil:

  1. crear un inflador:

    LayoutInflater inflater = (LayoutInflater)  this.getSystemService(LAYOUT_INFLATER_SERVICE); 
    
  2. inflar el diseño infantil:

    View childLayout = inflater.inflate(R.layout.child, 
          (ViewGroup) findViewById(R.id.child_id)); 
    
  3. adicionémoslo al padre:

    parentLayout.addView(childLayout); 
    

¡Ya está, disfrútalo!

+1

Respuesta precisa para

+7

Creo que debería ser 'findViewById (R.id.child_id));' no 'R.layout.child_id' – Ranjit

+0

Cuando hago esto, los anchos no parecen permanecer como se define en el diseño. No sé por qué –

Cuestiones relacionadas