android - studio - Toca en cualquier lugar para deslizar el menú abierto para el cajón de navegación
navigation drawer material design (5)
Como han dicho otros, y Cheney ha dicho en su respuesta, probablemente es mejor dejarlo como está previsto. Sin embargo, DrawerLayout
es un estilo diferente al SlidingMenu
. Google también agregó SlidingPaneLayout
que coincide más con el estilo de SlidingMenu.
Terminé implementando un SlidingPaneLayout
de esta manera, ya que era más de lo que estaba buscando después de todo. (Este es también el estilo de la aplicación YouTube / Hangouts)
<android.support.v4.widget.SlidingPaneLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/sliding_pane_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:id="@+id/left_pane"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<FrameLayout
android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"/>
</android.support.v4.widget.SlidingPaneLayout>
Luego para abrir con el botón de inicio de la barra de acción:
getActionBar().setDisplayHomeAsUpEnabled(true);
getActionBar().setHomeButtonEnabled(true);
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action buttons
switch(item.getItemId()) {
case android.R.id.home:
if (mPaneLayout.isOpen())
mPaneLayout.closePane();
else
mPaneLayout.openPane();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
Luego puede implementar un PanelSlideListener
para manejar cuando se desliza / abre / cierra.
Sugiero leer también la serie de Adam Powell en el cajón de navegación - la parte 3 se pone en uso del SlidingPaneLayout vs Navigation Drawer:
Parte 1: https://plus.google.com/+AdamWPowell/posts/2zi4DXd3jkm
Parte 2: https://plus.google.com/+AdamWPowell/posts/VdgexsZeXHW
Parte 3: https://plus.google.com/+AdamWPowell/posts/8j2GVw72i1E
Parte 4: https://plus.google.com/+AdamWPowell/posts/TtBFUXhe5HU
Para el menú deslizante de jfeinstein10 ( https://github.com/jfeinstein10/SlidingMenu ), puedo deslizar cualquier parte de la aplicación para abrir el menú.
Para Google, el nuevo cajón de navegación http://developer.android.com/design/patterns/navigation-drawer.html#side-nav , ¿hay alguna forma de que pueda tener un comportamiento similar?
Hasta ahora, desde la documentación, vi que solo se limitaba a deslizarse desde el borde o al tocar el ícono de la aplicación.
El usuario puede llevar el cajón de navegación a la pantalla deslizando desde el borde izquierdo de la pantalla o tocando el icono de la aplicación en la barra de acción.
Google, por la forma en que redactan su tutorial "Si el usuario toca el borde izquierdo de la pantalla (a 20 dp desde la izquierda)", parece que no quiere esa funcionalidad.
Consulte http://developer.android.com/design/patterns/navigation-drawer.html
"El usuario puede colocar el cajón de navegación en la pantalla al deslizar desde el borde izquierdo de la pantalla o al tocar el icono de la aplicación en la barra de acción".
No dicen ni deslizan desde ninguna parte de la pantalla. Tampoco tienen esa funcionalidad en ninguna de sus aplicaciones (G +, Gmail, etc.), por lo que si quieres esa funcionalidad probablemente deberías escribir tu propia (con gestos) o un tercero (por ejemplo, jfeinstein10).
EDITAR: la aplicación de Youtube te permite deslizarte a cualquier parte, pero la versión que tengo al menos (4.5.17) no parece que esté usando su nueva API.
He encontrado una solución. Puede configurar el margen de toque y hacer que sea tan amplio como sea su vista. Aqui esta el link
Establecer margen de arrastre para el cajón de navegación de Android
Puede usar un GestureDetector
para detectar gestos deslizantes y simplemente abrir el cajón de navegación con el método DrawerLayout.openDrawer()
.
Puedes usar esto
DrawerLayout mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
Field mDragger = mDrawerLayout.getClass().getDeclaredField(
"mLeftDragger");//mRightDragger or mLeftDragger based on Drawer Gravity
mDragger.setAccessible(true);
ViewDragHelper draggerObj = (ViewDragHelper) mDragger
.get(mDrawerLayout);
Field mEdgeSize = draggerObj.getClass().getDeclaredField(
"mEdgeSize");
mEdgeSize.setAccessible(true);
int edge = mEdgeSize.getInt(draggerObj);
mEdgeSize.setInt(draggerObj, edge * 3);