android navigation-drawer

Icono de alternar del cajón de navegación de Android a la derecha



navigation-drawer (2)

Mi requisito se muestra en la imagen a continuación. Mi cajón de navegación debe abrirse desde el lado derecho. He implementado esto. Mi cajón de navegación se abre de derecha a izquierda. Pero el problema es que el ícono de alternar siempre está en el lado izquierdo. ¿Cómo puedo configurar el icono de alternar a la derecha?

He verificado las siguientes preguntas SO, pero ninguna de ellas me ayudó:

Cambiar el icono de imagen del botón de alternar en el cajón de navegación de derecha a izquierda

Alternador del cajón en el cajón derecho

ingrese la descripción del enlace aquí

Esto es lo que he intentado:

código para mi diseño activity_main.xml

<?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/drawer" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" tools:openDrawer="end"> <android.support.design.widget.CoordinatorLayout android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" tools:context="com.example.nav.MainActivity" android:foregroundGravity="right"> <android.support.design.widget.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="end" android:theme="@style/AppTheme.AppBarOverlay"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" android:layout_gravity="right" app:popupTheme="@style/AppTheme.PopupOverlay" android:foregroundGravity="right" android:textAlignment="viewEnd" android:touchscreenBlocksFocus="false" /> </android.support.design.widget.AppBarLayout> <include layout="@layout/content_main" /> </android.support.design.widget.CoordinatorLayout> <android.support.design.widget.NavigationView android:id="@+id/navigation_view" android:layout_height="match_parent" android:layout_width="wrap_content" android:layout_gravity="end" app:headerLayout="@layout/nav_header" app:menu="@menu/menu_navigation" android:textAlignment="viewEnd" /> </android.support.v4.widget.DrawerLayout>

Código para mi actividad

public class MainActivity extends AppCompatActivity { private DrawerLayout drawerLayout; private Toolbar toolbar; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); initNavigationDrawer(); } @TargetApi(Build.VERSION_CODES.M) public void initNavigationDrawer() { NavigationView navigationView = (NavigationView)findViewById(R.id.navigation_view); navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(MenuItem menuItem) { int id = menuItem.getItemId(); switch (id){ case R.id.home: Toast.makeText(getApplicationContext(),"Home",Toast.LENGTH_SHORT).show(); drawerLayout.closeDrawers(); break; case R.id.settings: Toast.makeText(getApplicationContext(),"Settings",Toast.LENGTH_SHORT).show(); break; case R.id.trash: Toast.makeText(getApplicationContext(),"Trash",Toast.LENGTH_SHORT).show(); drawerLayout.closeDrawers(); break; case R.id.logout: finish(); } return true; } }); drawerLayout = (DrawerLayout)findViewById(R.id.drawer); ActionBarDrawerToggle actionBarDrawerToggle = new ActionBarDrawerToggle(this,drawerLayout,toolbar,R.string.drawer_open,R.string.drawer_close){ @Override public void onDrawerClosed(View v){ super.onDrawerClosed(v); } @Override public void onDrawerOpened(View v) { super.onDrawerOpened(v); } @Override public boolean onOptionsItemSelected(MenuItem item) { if (item != null && item.getItemId() == android.R.id.home) { if (drawerLayout.isDrawerOpen(Gravity.RIGHT)) { drawerLayout.closeDrawer(Gravity.RIGHT); } else { drawerLayout.openDrawer(Gravity.RIGHT); } } return false; } }; drawerLayout.addDrawerListener(actionBarDrawerToggle); actionBarDrawerToggle.syncState(); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (drawerLayout.isDrawerOpen(Gravity.RIGHT)) { drawerLayout.closeDrawer(Gravity.RIGHT); } else { drawerLayout.openDrawer(Gravity.RIGHT); } } }); } }


En su manifiesto de Android, agregue esta línea:

android:supportsRtl="true"

a su aplicación, así:

<application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true"

Luego, en su método onCreate, agregue esta línea:

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

ADVERTENCIA ::: Esto solo funciona para SdkVersion 17+, por lo que si su aplicación apunta a un SDK mínimo inferior, tendrá que crear un menú personalizado y anular el método OnCreateOptions (a menos que haya otra forma de la que no esté al tanto, que es definitivamente posible).

https://developer.android.com/guide/topics/manifest/application-element.html#supportsrtl


Escribí la clase EndDrawerToggle para una configuración muy similar a la suya: un DrawerLayout con una View cajón alineada al final, en una AppCompatActivity con una Toolbar personalizada como soporte de la Toolbar ActionBar .

import android.app.Activity; import android.support.v4.view.GravityCompat; import android.support.v4.widget.DrawerLayout; import android.support.v7.graphics.drawable.DrawerArrowDrawable; import android.support.v7.widget.AppCompatImageButton; import android.support.v7.widget.Toolbar; import android.support.v7.widget.Toolbar.LayoutParams; import android.view.View; import android.view.View.OnClickListener; public class EndDrawerToggle implements DrawerLayout.DrawerListener { private DrawerLayout drawerLayout; private DrawerArrowDrawable arrowDrawable; private AppCompatImageButton toggleButton; private String openDrawerContentDesc; private String closeDrawerContentDesc; public EndDrawerToggle(Activity activity, DrawerLayout drawerLayout, Toolbar toolbar, int openDrawerContentDescRes, int closeDrawerContentDescRes) { this.drawerLayout = drawerLayout; this.openDrawerContentDesc = activity.getString(openDrawerContentDescRes); this.closeDrawerContentDesc = activity.getString(closeDrawerContentDescRes); arrowDrawable = new DrawerArrowDrawable(toolbar.getContext()); arrowDrawable.setDirection(DrawerArrowDrawable.ARROW_DIRECTION_END); toggleButton = new AppCompatImageButton(toolbar.getContext(), null, R.attr.toolbarNavigationButtonStyle); toolbar.addView(toggleButton, new LayoutParams(GravityCompat.END)); toggleButton.setImageDrawable(arrowDrawable); toggleButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { toggle(); } } ); } public void syncState() { if (drawerLayout.isDrawerOpen(GravityCompat.END)) { setPosition(1f); } else { setPosition(0f); } } public void toggle() { if (drawerLayout.isDrawerOpen(GravityCompat.END)) { drawerLayout.closeDrawer(GravityCompat.END); } else { drawerLayout.openDrawer(GravityCompat.END); } } public void setPosition(float position) { if (position == 1f) { arrowDrawable.setVerticalMirror(true); toggleButton.setContentDescription(closeDrawerContentDesc); } else if (position == 0f) { arrowDrawable.setVerticalMirror(false); toggleButton.setContentDescription(openDrawerContentDesc); } arrowDrawable.setProgress(position); } @Override public void onDrawerSlide(View drawerView, float slideOffset) { setPosition(Math.min(1f, Math.max(0, slideOffset))); } @Override public void onDrawerOpened(View drawerView) { setPosition(1f); } @Override public void onDrawerClosed(View drawerView) { setPosition(0f); } @Override public void onDrawerStateChanged(int newState) { } }

La clase EndDrawerToggle es un reemplazo completo para ActionBarDrawerToggle en este caso, por lo que no necesitará ninguna de las configuraciones que tiene actualmente para eso. Todos los métodos DrawerListener todavía están disponibles para anulación, pero no es necesario hacerlo para la funcionalidad básica, ya que EndDrawerToggle maneja el estado del cajón por sí solo. Es igualmente innecesario manejar el clic de alternar usted mismo, por lo que tampoco necesita la navegación OnClickListener .

Simplemente DrawerListener una instancia de la palanca, agréguela como DrawerListener y sincronícela. Recomendaría sincronizar la palanca en el método onPostCreate() , para asegurarse de que se sincroniza correctamente, por ejemplo, después de un cambio de orientación.

private EndDrawerToggle drawerToggle; ... public void initNavigationDrawer() { NavigationView navigationView = ... ... drawerLayout = (DrawerLayout)findViewById(R.id.drawer); drawerToggle = new EndDrawerToggle(this, drawerLayout, toolbar, R.string.drawer_open, R.string.drawer_close); drawerLayout.addDrawerListener(drawerToggle); } @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); drawerToggle.syncState(); }