El cajón de navegación en android no está en pantalla completa

Desde que el google ha introducido el cajón de la navegación, intenté utilizar este componente para crear un facebook-como el menú. El problema es que el efecto visual parece ser diferente.

El google tiene la barra de acción de retener cuando el cajón está abierto, mientras que el facebook uno no. En lugar, toda la pantalla ha empujado a la derecha

He encontrado hay algunos lib puede lograr esto, pero ya que prefiero no incluir terceros lib en el proyecto, hay alguna manera de lograr esto? Gracias

Google:

Facebook:

Código basado en el tutorial de los cursores de navegación

protected void setupMenu(List<String> list, final ListView menu) { Adapter customAdapter = new Adapter(getActionBar().getThemedContext(), R.layout.item, list); menu.setAdapter(customAdapter); menu.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, final int pos, long id) { String selected = ((TextView) view.findViewById(R.id.itemTxt)) .getText().toString(); // define pass data final Bundle bData = new Bundle(); bData.putString("itemSelect", selected); drawer.setDrawerListener(new DrawerLayout.SimpleDrawerListener() { @Override public void onDrawerClosed(View drawerView) { super.onDrawerClosed(drawerView); FragmentTransaction tx = getSupportFragmentManager() .beginTransaction(); tx.replace(R.id.mainContent, Fragment.instantiate( MainActivity.this, "com.example.utilities.ContentPage", bData)); tx.commit(); } }); drawer.closeDrawer(menu); } }); } 

Bien crear un cajón de navegación personalizado es la mejor solución para usted. Entiendo que no desea utilizar a terceros, pero esto puede ser una solución rápida a su problema.

Si va a comprobar el código fuente de DrawerLayout, verá, que resposnible para este margen mínimo es la variable mMinDrawerMargin

Por lo tanto, hay al menos 2 soluciones (trucos) 1. extender DrawerLayout y establecer esta variable a 0 con la reflexión. Llame a este método de todos los constructores.

 private void init() { try { Field declaredField = getClass().getSuperclass().getDeclaredField("mMinDrawerMargin"); declaredField.setAccessible(true); declaredField.setInt(declaredField, 0); } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } 
  1. No es tan difícil

Overryde onMeasure método como este

 @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // taken from parents logic float density = this.getResources().getDisplayMetrics().density; int minMargin = (int) (64.0F * density + 0.5F); int widthMode = MeasureSpec.getMode(widthMeasureSpec); int widthSize = MeasureSpec.getSize(widthMeasureSpec); int newWidth = MeasureSpec.makeMeasureSpec(widthSize + minMargin, widthMode); super.onMeasure(newWidth, heightMeasureSpec); } 

También he creado proyecto de ejemplo aquí https://bitbucket.org/wnc_21/fsnavigationdrawer

Aquí está una solución rápida que trabajó para mí:

 <include android:id="@+id/left_drawer" android:orientation="vertical" **android:layout_width="320dp"** android:layout_height="match_parent" android:layout_gravity="start" layout="@layout/drawer"/> 

Establece el ancho del diseño incluido. Para dispositivos con diferentes tamaños de pantalla, puede establecer dinámicamente el ancho de este diseño incluido.

Todo lo mejor !!!!

Este problema es causado por el margen por lo que tenemos que restablecer el ancho: i resuelto este problema mediante la implementación de DrawerListener y envolver ListView dentro de un LinearLayout para hacer salas para otras vistas al lado de la vista de lista

Aquí está mi oyente

 public class NavigationDrawer implements DrawerLayout.DrawerListener { private DrawerLayout mDrawerLayout; protected boolean expanded = false; NavigationDrawer(Activity activity) { this.activity = activity; } public NavigationDrawer bindDrawerLayout(int id) { mDrawerLayout = (DrawerLayout) activity.findViewById(id); mDrawerLayout.setDrawerListener(this); return this; } @Override public void onDrawerSlide(View drawerView, float slideOffset) { if (!expanded) { Log.i("margin", "here we are"); LinearLayout layout = (LinearLayout) findViewById(R.id.left_drawer); layout.getLayoutParams().width = getResources().getDisplayMetrics().widthPixels; layout.requestLayout(); expanded = true; } } @Override public void onDrawerOpened(View drawerView) { } @Override public void onDrawerClosed(View drawerView) { } @Override public void onDrawerStateChanged(int newState) { } } 

Aquí está mi diseño:

 <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/application_drawer_layout" android:layout_width="fill_parent" android:layout_height="match_parent" android:background="#ffffff"> <FrameLayout android:id="@+id/application_content_frame" android:layout_width="match_parent" android:layout_height="match_parent" /> <LinearLayout android:id="@+id/left_drawer" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_gravity="start" android:background="#000000" android:orientation="vertical"> <ListView android:id="@+id/application_left_drawer" android:layout_width="fill_parent" android:layout_height="match_parent" android:layout_gravity="start" android:background="#111" android:choiceMode="singleChoice" android:divider="@android:color/transparent" android:dividerHeight="0dp" /> </LinearLayout> </android.support.v4.widget.DrawerLayout> 

Si desea implementar como el menú deslizante de Facebook, a continuación, para utilizar androides SlidingPaneLayout en lugar de NavigationDrawer.

 <android.support.v4.widget.SlidingPaneLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <LinearLayout android:layout_width="250dp" android:layout_height="match_parent" android:background="#CC00FF00" /> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="match_parent" android:background="#CC0000FF" > // add toolbar and other required layouts </LinearLayout> </android.support.v4.widget.SlidingPaneLayout> 

Agregar barra de herramientas en lugar de barra de acciones y no aplicar ningún tema barra de acción.

  • ¿Cómo añado iconos a la plantilla de gavetas de navegación de Android Studio?
  • Android 5.0 - Animar el AppCompat v7 21 icono de inicio de la hamburguesa a la flecha hacia atrás mediante programación
  • Android: Cajón de navegación en múltiples actividades
  • Actualizar el estado seleccionado del cajón de navegación después de volver a pulsar
  • El botón de acción flotante aparece sobre el cajón de navegación
  • Estado del fragmento del cajón de navegación de Android
  • ¿Cuál es el propósito de las herramientas: openDrawer = "start" al crear un DrawerLayout (con NavigationView) desde el asistente?
  • Menú contextual inapropiado dentro de un fragmento
  • Cómo agregar un separador de sección para el cajón de navegación en Android?
  • Cajón de navegación onNavigationDrawerItemSelected llamado antes de MainActivity onCreate?
  • Cajón de navegación con cabeceras / secciones
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.