Navegación Cajón de contenedores múltiples y mejores prácticas

Soy relativamente nuevo en el desarrollo de la interfaz de usuario de Android. Así que necesito la ayuda de desarrolladores más experimentados.
Estoy creando mi aplicación con el Navigation Drawer , he enfrentado con un montón de problemas.
En primer lugar, aquí está el código de ejemplo para el cajón de navegación.

 <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 --> <ListView android:id="@+id/left_drawer" android:layout_width="240dp" android:layout_height="match_parent" android:layout_gravity="start" android:choiceMode="singleChoice" android:divider="@android:color/transparent" android:dividerHeight="0dp" android:background="#111"/> </android.support.v4.widget.DrawerLayout> 

Este es un ejemplo sencillo del sitio oficial.

La vista de contenido principal (el FrameLayout anterior) debe ser el primer hijo en el DrawerLayout porque el orden XML implica z-ordering y el cajón debe estar encima del contenido.

En este ejemplo hay dos vistas anidadas: FrameLayout como se mencionó anteriormente para almacenar el contenido principal y ListView para representar el menú NavigationDrawer .

Asi que aqui están mis preguntas.

  1. La aplicación Real no tiene una sola vista en toda la actividad. Sobre todo Actividad tiene una gran cantidad de vista diferente, y varios fragmentos para hacer interfaz de usuario más sensible y proporcionar UX usuario mejor. Mis actividades son, por supuesto, diferentes puntos de vista y fragmentos (¿cuál es el propósito de las mismas actividades? :)). Una actividad tiene sólo un fragmento, otro tiene varios fragmentos, por lo que son todos diferentes … En el ejemplo de código anterior hay SOLO UN contenedor FrameLayout para la celebración de Fragmento sólo un fragmento, lo que tengo que hacer si mi actividad tiene dos, tres o Más fragmentos ?? ¿Cuál es la mejor solución en este caso.
  2. Como he descrito mi aplicación tiene múltiples actividades, por lo que mi cajón de navegación tiene que ser (de acuerdo a las prácticas de la interfaz de usuario de Android) en cada actividad para permitir que el usuario navega hasta los elementos de nivel superior de la aplicación. En este caso, es mejor tener una BaseActivity (he leído las respuestas aquí en stackoverflow) que mantendrá todas las cosas de configuración para NavigationDrawer . Pero en la medida en que el cajón de navegación requiere DrawerLayout en el diseño XML de la actividad, BaseActivity debería llamar setContentView método setContentView . Y todas las actividades heredadas de BaseActivity deben hacer algunos trucos para establecer su propio diseño, o no tiene sentido anular este método, ya que romperá toda la lógica. ¿Qué hacer en este caso?
  3. ¿Cuál es la manera más eficiente de crear una lista de cajones de navegación personalizada como en google + o YouTube sin utilizar una jerarquía de vista complicada que hace que la GPU funcione duro y puede traer mala experiencia al usuario

Para el segundo problema tengo algunas ideas de cómo puedo resolver esto, pero no sé es la forma correcta y qué enfoque es mejor.
La primera idea es implementar el patrón TemplateMethod. Crear método en BaseActivity algo como setupCustomViewGroup() y anularlo en todas las actividades inflar deseado viewgroup de xml y devolverlo de este método y que utilizarlo en inflar toda la vista.

O bien añadir explícitamente vista a la actividad, utilice combinar e incluir etiqueta.

Pero otra vez esto puede ser útil solamente para la actividad entera o un fragmento, qué hacer si tenemos más fragmentos, utiliza fragmentos anidados, pienso que es mala idea.

Además, mi objetivo es optimizar la jerarquía de la vista para que sea rápida y eficiente con el fin de llevar la suavidad, incluso en los dispositivos antiguos.

Estaré muy agradecido por cualquier persona que pueda describir o sugerir la forma más eficiente y correcta de seguir en este caso para que la interfaz de usuario responda y sea legible por el código.

Gracias.

1) Migrar de NavigationDrawer a SlideMenu (disponible en github).

2) Asegúrese de que su BaseActivity no tiene diseño en absoluto.

3) Inflar su elemento de vista de lista a través de ArrayAdapter.

Espero que sea de ayuda.

Solución:

1. Puedo pensar 2 casos aquí:

  1. Múltiples Fragmentos, Actividad Única: En este caso, la mejor manera es replace fragmentos en FrameLayout content_frame mientras cambia entre fragmentos. El contenido del navigation drawer sigue siendo el mismo para ellos
  2. Múltiples Fragmentos, Actividades Múltiples: En este caso, debe definir el diseño del contenido del navigation drawer diferente y utilizarlos con la setHasOptionsMenu(true) al cambiar de actividad.

2. Si está utilizando ListView como el navigation drawer entonces usted puede alcanzar fácilmente su trabajo poblando dinámicamente la row de ListView . Evite sobrepasar BaseActivity tanto como sea posible para este escenario. Si no está utilizando ListView como contenido del navigation drawer , puede definir un diseño diferente para diferentes actividades tal como se escribió en el punto 1

3. Creo que la aplicación de Google+ utiliza ListView como el navigation drawer de navigation drawer de su diseño custom . Depende de la necesidad de su aplicación, o bien puede ir con List o puede crear diseños personalizados simple para su aplicación

Espero que mi solución solucione sus dudas en alguna medida

Puedes usar fragmentos y llamarlos de la mainActivity así:

 MainActivity.java public class MainActivity extends Activity { .. .. @Override protected void onCreate(Bundle savedInstanceState) { .. mDrawerList.setOnItemClickListener(new SlideMenuClickListener()); } /** * Slide menu item click listener * */ private class SlideMenuClickListener implements ListView.OnItemClickListener { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // display view for selected nav drawer item displayView(position); } } /** * Diplaying fragment view for selected nav drawer list item * */ private void displayView(int position) { // update the main content by replacing fragments Fragment fragment = null; switch (position) { case 0: fragment = new HomeFragment(); break; case 1: fragment = new FindPeopleFragment(); break; case 2: fragment = new PhotosFragment(); break; case 3: fragment = new CommunityFragment(); break; case 4: fragment = new PagesFragment(); break; case 5: fragment = new WhatsHotFragment(); break; default: break; } if (fragment != null) { FragmentManager fragmentManager = getFragmentManager(); fragmentManager.beginTransaction() .replace(R.id.frame_container, fragment).commit(); // update selected item and title, then close the drawer mDrawerList.setItemChecked(position, true); mDrawerList.setSelection(position); setTitle(navMenuTitles[position]); mDrawerLayout.closeDrawer(mDrawerList); } else { // error in creating fragment Log.e("MainActivity", "Error in creating fragment"); } } 

}

Echa un vistazo a este tutorial, puede ayudarte más

  • Cambiar los elementos del cajón de navegación dentro del fragmento
  • Desenfocar el fondo del cajón de navegación
  • Java.lang.NullPointerException: Intenta invocar el método virtual 'ActionBar.setNavigationMode (int)' en una referencia de objeto nulo
  • Imitando el cajón de navegación de la aplicación youtube / gmail
  • Administrar la barra de herramientas y el botón de retroceso del fragmento en android
  • Android, DrawerLayout + Fragmentos + CollapsingToolbarLayout
  • ¿Por qué DrawerLayout a veces falla al abrirse?
  • Alternar el cajón de navegación 'abrir' en el botón / clic de imagen
  • Android: 2 o más ExpandableListView dentro del Gaveta de navegación
  • El cajón de navegación se cerrará incluso si se sobreescribe OnBackPressed ()
  • ¿Cómo evitar la recreación de fragmentos cuando se selecciona de NavigationDrawer?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.