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.
- Actualizar el estado seleccionado del cajón de navegación después de volver a pulsar
- Selección de elementos de fila de reciclaje
- Cómo establecer el comportamiento de comprobación compartida en todos los grupos en NavigationView?
- El título de CollapsingToolbarLayout desaparece
- ¿Cómo agregar valor de notificación para el elemento en NavigationView para el cajón de diseño de material?
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.
- 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. - 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 paraNavigationDrawer
. Pero en la medida en que el cajón de navegación requiereDrawerLayout
en el diseño XML de la actividad,BaseActivity
debería llamarsetContentView
métodosetContentView
. Y todas las actividades heredadas deBaseActivity
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? - ¿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.
- Android Api 23 Cambiar Navegación Ver headerLayout textview
- Añadir 2 listview en el cajón de navegación, sólo uno funciona
- ¿Cómo crear un cajón de navegación personalizado que abre ListView junto al cajón onitemclick?
- Reemplazar el diseño de la barra de herramientas de acuerdo con el fragmento visualizado
- InflateException en la llamada al método inflater.inflate ()
- Cómo abrir el cajón de navegación en el botón de clic en el fragmento principal?
- Diseño de material: cómo establecer transparencia para el botón de acción flotante de Android
- Salir de la aplicación cuando presione el botón Atrás en actividad con múltiples fragmentos en el Gaveta de navegación
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í:
- Múltiples Fragmentos, Actividad Única: En este caso, la mejor manera es
replace
fragmentos enFrameLayout
content_frame
mientras cambia entre fragmentos. El contenido delnavigation drawer
sigue siendo el mismo para ellos - Múltiples Fragmentos, Actividades Múltiples: En este caso, debe definir el diseño del contenido del
navigation drawer
diferente y utilizarlos con lasetHasOptionsMenu(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
- Establecer la altura inicial de la imagen de paralaje en CollapsingToolbarLayout
- Android, Cómo mostrar el buffering% de onBufferingUpdate