No obtenga el rootLayoutContainer en un fragmento (vista previa de Android 3.0)

Actualmente estoy entrando en la API de fragmentos de la Vista previa de Android 3.0 y he construido la siguiente codificación mínima:

Tengo una Actividad, que incluirá Fragmento (s), que actualmente se implementa de la siguiente manera:

public class Cockpit extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.cockpit); } public static class InfoFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment ViewGroup infoFragmentRoot = (ViewGroup) getActivity().findViewById( R.id.infoFragmentRoot) ; return inflater.inflate(R.id.infoFragment, container, false); } } 

}

La distribución correspondiente de la actividad:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <fragment android:name="test.android.ui.cockpit.Cockpit$InfoFragment" android:id="@+id/infoFragment" android:layout_weight="1" android:layout_width="10dp" android:layout_height="match_parent" > <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="12dp" android:id="@+id/infoFragmentRoot" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> </LinearLayout> </fragment> 

Ahora, no entiendo por qué el contenedor ViewGroup en el onCreateView () en la clase interna InfoFragment es un nullpointer, ni entiendo, por qué

 ViewGroup infoFragmentRoot = (ViewGroup) getActivity().findViewById( R.id.infoFragmentRoot) ; 

devuelve también null.

Gracias por la retroalimentación.

Tienes algunos problemas aquí. En primer lugar, no desea agregar etiquetas dentro de la etiqueta <fragment> . Piense en la etiqueta de fragmento como un marcador de posición. El método onCreateView () del fragmento es responsable de definir la jerarquía de vista de su fragmento, no el archivo XML de diseño de la actividad. Lo que puede hacer es crear un archivo XML de diseño independiente para que sea sólo el diseño del fragmento. Entonces dentro de onCreateView (), usted toma el insuflador pasado adentro, y hace algo como esto:

  View v = inflater.inflate(R.layout.frag1, container, false); TextView text1 = (TextView) v.findViewById(R.id.text1); text1.setText( myTextData ); return v; 

Observe que el parámetro attach para inflar () es falso? Android se encargará de adjuntar la vista devuelta a su contenedor más tarde.

No se garantiza que la jerarquía de vista de su actividad exista hasta que el fragmento obtenga la devolución de llamada onActivityCreated (). Así que el intento de obtener infoFragmentRoot podría devolver null dentro de onCreateView (). Pero ni siquiera estoy seguro de lo que está pasando cuando esa etiqueta está enterrada dentro de su <fragment> .

En este caso en particular, donde has incrustado la etiqueta en el diseño de tu actividad, se llamará la devolución de llamada onInflate () de tu fragmento con el resto de los atributos de tu etiqueta. La teoría es que puedes agregar esos atributos al conjunto de argumentos en tu fragmento, y luego recuperar esos valores más adelante en onCreateView () (usando setArguments () y getArguments ()). Digo en teoría porque parece que hay un error en el código que maneja un cambio de configuración (por ejemplo, de paisaje a retrato), resultando en onInflate () que se llama después onCreateView () cuando el fragmento se está reconstruyendo después de un cambio de configuración. Consulte el informe de defectos http://code.google.com/p/android/issues/detail?id=14796 .

Por ahora, te recomiendo que extraes el diseño de tu fragmento a un archivo XML de diseño separado (por ejemplo, frag1.xml), el uso de mi código anterior para inflar ese diseño en onCreateView (). Y no te preocupes por los atributos que se pasan a onInflate ().

Tampoco desea utilizar onCreate para instanciar su diseño, que todos se manejarán dentro de la actividad principal. Salvar el paquete es todo lo que he hecho hasta ahora

  • Viewpager no visible cuando tiene cualquier otro diseño como su hermano
  • Problema extraño que refresca ViewPager con nuevo contenido:
  • La adición de una vista crea un ListView dentro de un fragmento para actualizar
  • Cómo mostrar un DialogFragment de un controlador
  • Colocar un anuncio de banner para que se sitúe a continuación y se separe de ViewPager
  • Acceder a un método de un fragmento de la actividad ViewPager
  • La mejor manera de implementar varios diálogos de alertas en una actividad
  • Java.lang.IllegalStateException: Fragmento ya no existe para la clave f1: index 3
  • ¿Cómo cambiar el indicador de tablayout de arriba a abajo?
  • Diferencia entre Fragmento y FragmentoActividad
  • Barra de herramientas no aparece en fragmento con google maps
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.