La mejor manera de implementar un cajón de desplazamiento de navegación
He estado agregando un cajón de navegación a una de mis aplicaciones, y comencé a preguntarme si sería mejor cambiar de usar un ListView
a múltiples TextView
para los elementos de la lista de cajones de navegación. Observando las Directrices de Diseño de Google sobre el contenido del Cajón de Navegación (específicamente la sección sobre 'Desplazamiento') , me di cuenta de que puede verse mejor con múltiples TextView
.
Por el momento, estoy usando un ListView
y ImageView
en mi cajón de navegación (se ve un poco como esto.Sin embargo, cuando me desplaza en el cajón de navegación (lo hago girando mi dispositivo de paisaje como no hay suficientes elementos en mi lista Pero sólo las ListView
, y el ImageView
permanece como está.Quiero que sea capaz de scoll más como este, donde el ImageView
también se desplaza con el ListView
.
- Cambiar elementos de NavigationView cuando el usuario está registrado
- ¿Cómo crear una lista desplegable dentro de un cajón de navegación (en Android)?
- ¿Barra de herramientas Android para API 19? (Para la API 21 funciona bien)
- Notificación de la divisa en la barra de herramientas en la barra de herramientas - Android
- Alternar el cajón de navegación a través del título de la barra de acciones
Además, encontré que mi ListView
en mi cajón de navegación no tiene los efectos de rizo como se muestra en esta imagen, aunque otros ListView
en mis otras Activity
y Fragment
.
¿Cuáles son los problemas que enfrento y cómo puedo resolverlos?
Actualizar:
En la aplicación de E / S de Google (2014), parece haber un LinearLayout
en la parte inferior del diseño del cajón de navegación que creo que es responsable de la lista de elementos mostrados. ¿Podría alguien explicar cómo funcionaría?
- Cómo abrir diferentes actividades al hacer clic en los elementos del cajón de navegación?
- Cajón de navegación Cambia el fondo mientras se desplaza
- Desplazamiento de izquierda a derecha con el visor y el cajón de navegación
- ¿En qué componentes de interfaz de usuario deben utilizarse los filtros y / o la clasificación?
- Adaptador personalizado para cajón de navegación
- ¿Puedo abrir el diseño del cajón con animación mediante programación?
- Los datos del fragmento se van nulos cuando otro fragmento se carga
- ¿Cómo crear un divisor simple en el nuevo NavigationView?
Sólo se desplaza el ListView y el ImageView permanece como está
Suena como su cajón contiene un ImageView
en la tapa y entonces un ListView
sigue. Con esta configuración sólo se desplaza el ListView
(porque es la única vista que se puede desplazar).
ImageView
agregar el ImageView
como un encabezado que siempre está al principio de la lista. Como uno de los comentarios sugeridos, haga listView.addHeaderView
.
Parece haber un LinearLayout en la parte inferior del diseño del cajón de navegación que creo que es responsable de la lista de elementos mostrados. ¿Podría alguien explicar cómo funcionaría?
Utilizan el LinearLayout
como un contenedor para contener todos los TextView
s:
private void createNavDrawerItems() { mDrawerItemsListContainer = (ViewGroup) findViewById(R.id.navdrawer_items_list); ... int i = 0; for (int itemId : mNavDrawerItems) { mNavDrawerItemViews[i] = makeNavDrawerItem(itemId, mDrawerItemsListContainer); mDrawerItemsListContainer.addView(mNavDrawerItemViews[i]); ++i; } }
Creo que la razón por la que utilizan un LinearLayout
e inflar todos los elementos de forma programática es ser capaz de utilizar separador elementos fácilmente:
private View makeNavDrawerItem(final int itemId, ViewGroup container) { ... if (itemId == NAVDRAWER_ITEM_SEPARATOR) { layoutToInflate = R.layout.navdrawer_separator; } else if (itemId == NAVDRAWER_ITEM_SEPARATOR_SPECIAL) { layoutToInflate = R.layout.navdrawer_separator; } else { layoutToInflate = R.layout.navdrawer_item; } ... return view; }
En un ListView
tendría que crear un tipo de elemento independiente y utilizar el diseño del divisor allí, lo que posiblemente podría ser más engorroso.
A primera vista , sin embargo, este código sólo parece estar reinventando la rueda ya que todo esto es posible con un ListView
.
A partir del 29 de mayo de 2015 (después de Google I / O 2015 ), puede utilizar la Biblioteca de soporte de diseño de Android para agregar un NavigationView
a su (s) aplicación (s). El artículo Android Developer Blogspot establece lo siguiente:
Vista de navegación
El cajón de navegación puede ser un punto focal importante para la identidad y la navegación en su aplicación y la coherencia en el diseño aquí puede hacer una diferencia considerable en la facilidad de su aplicación es navegar, en particular para los usuarios de primera vez.
NavigationView
hace esto más fácil proporcionando el marco que necesita para el cajón de navegación, así como la capacidad de inflar sus elementos de navegación a través de un recurso de menú.…
A continuación, puede comenzar a utilizar la biblioteca de diseño con una sola nueva dependencia:
compile 'com.android.support:design:22.2.0'
…
La biblioteca de diseño, AppCompat y toda la Biblioteca de soporte técnico de Android son herramientas importantes para proporcionar los bloques de construcción necesarios para crear una aplicación moderna y de gran apariencia para Android sin crear todo desde cero.
La implementación del cajón de navegación desplazable con android.support.v4.widget.DrawerLayout y NavigationView podría ser incluso más sencillo de lo que se describe en: http://android-developers.blogspot.ru/2015/05/android-design-support-library. Html
Ese artículo sugiere agregar cada elemento del Cajón de navegación de su aplicación como elemento de menú. Esto es genial y sin duda una manera de ir para la mayoría de los desarrolladores. Pero ¿qué pasa si ya tiene un cajón de navegación implementado dentro, por ejemplo, Linear Layout?
Parece que usted puede fácilmente hacer su vieja buena disposición desplazable: sólo se establece como una "app: headerLayout" de la NavigationView. No más cambios son necesarios! Por lo tanto, en una solución final tendrá:
Un diseño de su actividad, similar a la anterior publicación en el blog, pero sin un atributo "app: menu =" @ menu / drawer ", por ejemplo:
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true"> <!-- your content layout --> <android.support.design.widget.NavigationView android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" app:headerLayout="@layout/drawer_header" /> </android.support.v4.widget.DrawerLayout>
Y un diseño para todo el contenido de su cajón de edad en el archivo "drawer_header.xml", migrado sin ningún cambio en este cajón desplazable, por ejemplo, esto:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:choiceMode="singleChoice" android:orientation="vertical"> <TextView android:id="@+id/myFirstButton" android:onClick="onMyFirstButtonClick" android:text="@string/my_first_button_title"/> <TextView android:id="@+id/goToTheTopButton" android:onClick="onGoToTheTopButtonClick" android:text="@string/go_to_the_top_title"/> <View style="@style/Divider"/> <!-- Some other "menu items" --> </LinearLayout>
Para obtener un ejemplo de funcionamiento completo, vea este diseño de la actividad: https://github.com/andstatus/andstatus/blob/master/app/src/main/res/layout/timeline.xml y este commit, donde migré a un Cajón de navegación desplazable : https://github.com/andstatus/andstatus/commit/a80b299de714bdd65cacb138ffb31adc3ea23a98
- GCM: onMessage () de GCMIntentService se llama Muchas veces?
- Navegación de Google (Android 1.6) intento de devolución de llamada