Fragmento de NavigationDrawer con ListView y encabezado personalizado

Estoy teniendo un problema y no puedo solucionarlo. En mi aplicación tengo un cajón de navegación definido como a continuación:

Activity_main.xml

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent" > <!-- As the main content view, the view below consumes the entire space available using match_parent in both dimensions. --> <FrameLayout android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent" /> <!-- android:layout_gravity="start" tells DrawerLayout to treat this as a sliding drawer on the left side for left-to-right languages and on the right side for right-to-left languages. If you're not building against API 17 or higher, use android:layout_gravity="left" instead. --> <!-- The drawer is given a fixed width in dp and extends the full height of the container. --> <fragment android:id="@+id/navigation_drawer" android:layout_width="@dimen/navigation_drawer_width" android:layout_height="match_parent" android:layout_gravity="start" /> 

En la clase MainActivity, normalmente setContentView pasa este xml: MainActivity.java

 setContentView(R.layout.activity_main); mNavigationDrawerFragment = (NavigationDrawerFragment) getSupportFragmentManager().findFragmentById(R.id.navigation_drawer); 

En mi NavigationDrawerFragment onCreateView normalmente hincho su xml con esto:

NavigationDrawerFragment.java

 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View root = (View)inflater.inflate(R.layout.fragment_navigation_drawer,null,false); mDrawerListView = (ListView)root.findViewById(R.id.drawer_list_view); mDrawerListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { selectItem(position); } }); 

Y esto es fragment_navigation_drawer.xml: fragment_navigation_drawer.xml

 <LinearLayout android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" xmlns:android="http://schemas.android.com/apk/res/android"> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="10dp"> <ImageView android:id="@+id/profile_picture" android:layout_width="50dp" android:layout_height="50dp" android:layout_alignParentLeft="true"/> <TextView android:id="@+id/user_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:layout_toRightOf="@id/profile_picture" android:textStyle="bold" android:textSize="15sp" /> <TextView android:id="@+id/user_mail" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/user_name" android:layout_alignLeft="@id/user_name" android:fontFamily="sans-serif-light" /> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:src="@android:drawable/ic_menu_close_clear_cancel"/> </RelativeLayout> <ListView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:choiceMode="singleChoice" android:id="@+id/drawer_list_view" android:dividerHeight="0dp" android:background="@color/navigation_drawer_background" /> 

Cuando ejecuto el código, recibo una excepción en el setContentView de MainActivity diciendo:

 Caused by: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first. 

Creo que hay algo mal con el diseño de NavigationDrawer. ¿Qué estoy haciendo mal?

EDIT: He cambiado mi diseño a:

 <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent"> <!-- The main content view --> <FrameLayout android:id="@+id/content_frame" android:layout_width="match_parent" android:layout_height="match_parent"/> <!-- The navigation drawer --> <FrameLayout android:id="@+id/left_drawer_frame" android:layout_width="@dimen/navigation_drawer_dimension" android:layout_height="match_parent" android:layout_gravity="start" android:background="@android:color/white"/> 

Así que con FrameLayout, en mi actividad uso:

 mFragment = new Fragment(); getSupportFragmentManager() .beginTransaction() .replace(R.id.content_frame, mFragment) .commit(); 

Y yo inflar el fragmento con esto:

 View root = inflater.inflate(R.layout.fragment_main, container, false); 

Todo parece funcionar

Mejor tarde que nunca.

Observando su código (nombres de variables, estructura de diseño, etc.) Supongo que está utilizando Android Studio y creó el proyecto utilizando la plantilla "Gaveta de navegación" proporcionada por el asistente de Android Studio "Crear proyecto".

Si la suposición anterior es verdadera, entonces su problema reside en el onCreateView de NavigationDrawerFragment . Debe devolver la vista inflada de onCreateView y lo que debe devolver en este caso concreto es root no mDrawerListView

 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View root = (View)inflater.inflate(R.layout.fragment_navigation_drawer,null,false); mDrawerListView = (ListView)root.findViewById(R.id.drawer_list_view); mDrawerListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { selectItem(position); } }); return root; // This is wrong // return mDrawerListView; } 

Es un error común que ocurre cuando editamos el código generado por IDE.

Espero que esto ayude.

En tu fragmento id: navigation drawer add

 tools:layout="@layout/fragment_navigation_drawer" 
  • ¿Debo especificar el nombre de la actividad principal en el manifiesto de Android?
  • Cómo cambiar el color de la barra de estado en android
  • Integre tabhost y el cajón de navegación
  • Vista de navegación de Android: Desplácese por los elementos del menú sólo para emitir
  • El cajón de navegación no cierra
  • Android Navigation Drawer implementado con Actividades
  • Setting launchMode = "singleTask" contra la actividad de configuración launchMode = "singleTop"
  • Cómo implementar android Barra de herramientas Botón Atrás
  • Android fragmento de navegación para las tabletas - una o varias actividades?
  • ¿Cómo detectar si el cajón de navegación está abierto?
  • Cómo actualizar la lista del cajón de navegación tan pronto como su abrir / cerrar en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.