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

  • Mi aplicación se bloquea en modo horizontal
  • Tabulaciones de Fragmentos y Actividades de Fragmentos
  • YouTubePlayerSupportFragment en el elemento ListView es nulo
  • Robolectric: ¿Cómo puedo probar una actividad que contiene un SherlockFragment?
  • RecyclerView no llama aCreateViewHolder o onBindView
  • El evento onActivityResult del fragmento no se llama después del cambio de orientación
  • OnAttach (Activity) obsoleto: donde puedo comprobar si la actividad implementa la interfaz de devolución de llamada
  • Pantalla débil e interacción de bloques con hojas de fondo
  • Android DialogFragment desaparece después del cambio de orientación
  • Trabajando con DIalogs en fragmentos
  • Traiga el fragmento al frente (sin fragmentos de recreación)
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.