Cómo configurar el Cajón de navegación para que se abra de derecha a izquierda

En primer lugar, sé que esta pregunta apareció aquí antes, pero después de intentar mucho todavía no tuve éxito. Estoy trabajando en el ejemplo del sitio de Desarrolladores de Android .

Estoy intentando configurar el menú para que se abra de derecha a izquierda en lugar de cómo se implementa en el ejemplo (de izquierda a derecha). Además, quiero mover el botón de menú abierto al lado derecho de la barra de acciones. También coloco algunas respuestas aquí, por ejemplo en esta respuesta .

Intento cambiar la gravedad de las vistas y los diseños pero obtengo el error:

sin vista del cajón encontrada con gravedad absoluta IZQUIERDA

¿Puedes ayudarme a averiguar cuál es el problema en mi código y qué debería cambiar para configurar el menú para que se abra desde la derecha y para mover el botón de la barra de acción hacia el lado derecho?

el código xml está aquí:

    

En su diseño principal, configure su gravedad ListView a la derecha:

 android:layout_gravity="right" 

También en tu código:

 mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close) { @Override public boolean onOptionsItemSelected(MenuItem item) { if (item != null && item.getItemId() == android.R.id.home) { if (mDrawerLayout.isDrawerOpen(Gravity.RIGHT)) { mDrawerLayout.closeDrawer(Gravity.RIGHT); } else { mDrawerLayout.openDrawer(Gravity.RIGHT); } } return false; } }; 

espero que funcione 🙂

Agrega este código para manifestar:

  

y luego escribe este código en Oncreate:

 getWindow().getDecorView().setLayoutDirection(View.LAYOUT_DIRECTION_RTL); 

Esto funciona para mi. 😉

SOLUCIÓN


your_layout.xml:

      

YourActivity.java:

 @Override protected void onCreate(Bundle savedInstanceState) { //... toolbar = (Toolbar) findViewById(R.id.toolbar); drawer = (DrawerLayout) findViewById(R.id.drawer_layout); ActionBarDrawerToggle toggle = new ActionBarDrawerToggle( this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); drawer.setDrawerListener(toggle); toggle.syncState(); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (drawer.isDrawerOpen(Gravity.RIGHT)) { drawer.closeDrawer(Gravity.RIGHT); } else { drawer.openDrawer(Gravity.RIGHT); } } }); //... } 

Aquí está la documentación en el cajón y parece que puede configurarlo para que se abra desde la izquierda o la derecha.

La colocación y el diseño del cajón se controlan mediante el atributo android: layout_gravity en las vistas secundarias correspondientes a qué lado de la vista desea que aparezca el cajón: a la izquierda o a la derecha. (O inicio / final en las versiones de plataforma que admiten la dirección de diseño).

http://developer.android.com/reference/android/support/v4/widget/DrawerLayout.html

En primer lugar, debe poner este código en su AppManifest.xml en la etiqueta de la aplicación:

 android:supportsRtl="true" 

luego en su archivo activity_main.xml, ponga este fragmento de código:

 android:layout_direction="rtl" 

el problema principal con el siguiente error:

sin vista del cajón encontrada con gravedad absoluta IZQUIERDA

es eso, definiste el

 android:layout_gravity="right" 

para list-view en la derecha, pero intente abrir el cajón desde la izquierda, llamando a esta función:

 mDrawerToggle.syncState(); 

y haciendo clic en el icono de la hamburguesa

simplemente comente la función anterior e intente abrir / cerrar el menú como dijo @Rudi.

He resuelto este problema cambiando la gravedad de la vista de navegación para finalizar en lugar de comenzar y funciona para mí

Eche un vistazo a esto: deslice ExpandableListView en el formato DrawerLayout de derecha a izquierda

Supongo que tiene el ActionBarDrawerToggle implementado, el truco es anular el onOptionsItemSelected(MenuItem item) dentro del objeto ActionBarDrawerToggle con esto:

  @Override public boolean onOptionsItemSelected(MenuItem item) { if (item != null && item.getItemId() == android.R.id.home) { if (mDrawer.isDrawerOpen(Gravity.RIGHT)) { mDrawer.closeDrawer(Gravity.RIGHT); } else { mDrawer.openDrawer(Gravity.RIGHT); } return true; } return false; } 

Asegúrese de llamar a esto desde onOptionsItemSelected(MenuItem item) en la Actividad:

 @Override public boolean onOptionsItemSelected(MenuItem item) { if(mDrawerToggle.onOptionsItemSelected(item)) { return true; } return super.onOptionsItemSelected(item); } 

Esto le permitirá usar la funcionalidad del botón de inicio. Para mover el botón hacia el lado derecho de la barra de acción, deberá implementar un elemento de acción personalizado, y tal vez algunas otras cosas para que funcione como usted desee.

Lo hice después de la modificación al ejemplo de la actividad del cajón de navegación en Android Studio. Con bibliotecas de soporte 25.3.1.

MainActivity.java:

 private DrawerLayout mDrawerLayout; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { actionBar.setDisplayHomeAsUpEnabled(true); } mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); navigationView.setNavigationItemSelectedListener(this); } @Override public void onBackPressed() { if (mDrawerLayout.isDrawerOpen(GravityCompat.END)) { mDrawerLayout.closeDrawer(GravityCompat.END); } else { super.onBackPressed(); } } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { int itemId = item.getItemId(); switch (itemId) { case android.R.id.home: finish(); return true; case R.id.action_right_drawer: if (mDrawerLayout.isDrawerOpen(GravityCompat.END)) { mDrawerLayout.closeDrawer(GravityCompat.END); } else { mDrawerLayout.openDrawer(GravityCompat.END); } return true; default: return super.onOptionsItemSelected(item); } } @SuppressWarnings("StatementWithEmptyBody") @Override public boolean onNavigationItemSelected(MenuItem item) { // Handle navigation view item clicks here. mDrawerLayout.closeDrawer(GravityCompat.END); return true; } 

main.xml (descargue ic_menu_white_24px desde https://material.io/icons/ ):

     

En el cambio activity_main.xml

 android:layout_gravity="start" 

a

 android:layout_gravity="end" 

Abrirlo desde rtl no es bueno para la experiencia del usuario, para hacerlo receptivo a la configuración regional del usuario Acabo de agregar la siguiente línea a mis parámetros DrawerLayout:

 android:layoutDirection="locale" 

Lo agregué a mi AppBarLayout para hacer que el diseño de la hamburguesa coincidiera también con la dirección de apertura del cajón.

Esta respuesta es útil para configurar la navegación de derecha a izquierda, pero no tiene solución para configurar su icono para que sea el lado derecho. Este código puede arreglarlo. Si le da el drawer como su primer ViewCompat.LAYOUT_DIRECTION_RTL y ViewCompat.LAYOUT_DIRECTION_RTL como segundo param, el diseño de entier se configurará en RTL. Es una solución rápida y simple, pero no creo que pueda ser una solución correcta para aquellos que solo quieran abrir el menú de derecha a izquierda y configurar su ícono para que esté en el lado derecho. (Aunque, depende de su propósito). Sin embargo, sugiero dar la toolbar de toolbar lugar del drawer . De esta forma, solo la barra de herramientas se ha convertido en RTL. Así que creo que la combinación de estas 2 respuestas puede hacer exactamente lo que quieras.

De acuerdo con estas descripciones, su código debería ser así:

(Agregue estas líneas al método onCreate)

 final DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); // Set it final to fix the error that will be mention below. ViewCompat.setLayoutDirection(toolbar, ViewCompat.LAYOUT_DIRECTION_RTL); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (drawer.isDrawerOpen(Gravity.RIGHT)) drawer.closeDrawer(Gravity.RIGHT); else drawer.openDrawer(Gravity.RIGHT); } }); 

Tenga en cuenta que debe finalizar el cajón, de lo contrario obtendrá este error:

Se accede al “cajón” variable desde dentro de la clase interna, debe declararse final

Y no te olvides de usar end lugar de start en el onNavigationItemSelected :

 drawer.closeDrawer(GravityCompat.END); 

y en tu activity_main.xml