2011-12-16 11 views
11

Vamos directo al código.findViewById devuelve nulo en una vista <include>

Código de actividad, el método onCreate

setContentView(R.layout.main); 

View main_view = findViewById(R.id.main_view); 
View view_flipper = main_view.findViewById(R.id.vf); 
View first_tab = view_flipper.findViewById(R.id.prev_pane); 

El código de diseño main.xml:

<ViewFlipper android:id="@+id/vf" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    > 

    <include android:id="@+id/prev_pane" layout="@layout/vf_inner" /> 
<include android:id="@+id/cur_pane" layout="@layout/vf_inner" /> 
    <include android:id="@+id/next_pane" layout="@layout/vf_inner" /> 
</ViewFlipper> 

El problema! La vista principal se encuentra correctamente, por lo que ViewFlipper, pero prev_pane o cur_pane o next_pane no se encuentran, se devuelve un puntero nulo. ¿Alguna idea de por qué?

Esta actividad se invoca a través de una pestaña mediante el uso de una intención. Todas las referencias se resuelven correctamente a excepción de identificación en incluye

Cuando examino las variables, encuentro el contenido de la disposición vf_inner en mChildren

Respuesta

8

Eso es porque <include /> etiquetas no son un punto de vista real en su jerarquía de interfaz de usuario. Son más de una copia & instrucciones de pegar para las herramientas de Android.

Si desea encontrar los paneles en tiempo de ejecución, agregue los ID a los elementos raíz de los diseños incluidos. De esta manera se pueden encontrar a través del findViewById().

+0

Bueno, todos los paneles son idénticos, sin embargo, deben tener diferente contenido. ¿Cómo puedo conseguir esto? Todas las vistas incluidas contienen una imagen y una vista de texto con una ID. La imagen permanece estática, pero el texto es diferente para todos los paneles. – Artis

+0

Oh, ya veo. Creo que XML es limitado en ese sentido * (al menos no tengo idea atm) *. Sin embargo, puedes construir esto desde el código. Infle tres instancias del diseño mediante el uso del servicio de inflado de diseño, use 'setId()' en las vistas infladas. Luego busque ViewFlipper a través de 'findViewById()' y agregue los tres diseños a través de 'ViewFlipper.addView()'. –

+3

Tenga en cuenta que también puede hacer referencia a los elementos secundarios de ViewFlipper a través de ['ViewFlipper.getChildAt (index)'] (http://developer.android.com/reference/android/view/ViewGroup.html#getChildAt (int)) en lugar de su id. P.ej. como: 'Ver first_tab = view_flipper.getChildAt (0)'. –

0

Una cosa que puede hacer es ajustar las instrucciones <include> dentro de un diseño principal (que todavía es un elemento secundario de su diseño principal principal). Proporcione a esos puntos de vista diferentes identificadores para que pueda findViewById cada uno de ellos por separado.

+0

Todavía se tratarán como elementos secundarios del viewflipper, por lo que no debería tener problemas si solo tiene un número fijo de vistas. – josephus

+0

+1 Correcto, me perdí esta posibilidad. Eso funciona si * necesita * identificadores asignados a los niños sin embargo. Si no los necesita, use 'ViewFlipper.getChildAt()' en su lugar, como se describe en los comentarios de mi respuesta. La razón para esto es que debe mantener la jerarquía de vista lo más plana posible. Las jerarquías de vista anidadas profundas tienen un fuerte impacto en el rendimiento. –

Cuestiones relacionadas