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 tratando de 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 acción. También rojo algunas respuestas aquí, por ejemplo en esta respuesta .
Intento cambiar la gravedad de las vistas y los diseños, pero aparece el error:
no se encontró vista de cajón con gravedad absoluta IZQUIERDA
¿Puede ayudarme a averiguar cuál es el problema en mi código y qué debo 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 la derecha?
el código xml está aquí:
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_layout"
android:layout_gravity="right"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<FrameLayout
android:id="@+id/content_frame"
android:layoutDirection="rtl"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
<ListView android:id="@+id/left_drawer"
android:layout_width="200dp"
android:layout_height="match_parent"
android:layout_gravity="right"
android:choiceMode="singleChoice"
android:divider="@android:color/transparent"
android:dividerHeight="10dp"
android:background="#111"/>
</android.support.v4.widget.DrawerLayout>
Respuestas:
En su diseño principal, establezca su
ListView
gravedad 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 :)
fuente
setCustomView
método? En caso afirmativo, ¿le importaría pegar algunos enlaces que muestren cómo hacerlo?Agregue este código al manifiesto:
<application android:supportsRtl="true">
y luego escribe este código en Oncreate:
getWindow().getDecorView().setLayoutDirection(View.LAYOUT_DIRECTION_RTL);
Esto funciona para mi. ;)
fuente
SOLUCIÓN
your_layout.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_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" tools:openDrawer="end"> <include layout="@layout/app_bar_root" android:layout_width="match_parent" android:layout_height="match_parent" /> <android.support.design.widget.NavigationView android:id="@+id/nav_view" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="end" android:fitsSystemWindows="true" app:itemTextColor="@color/black" app:menu="@menu/activity_root_drawer" /> </android.support.v4.widget.DrawerLayout>
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); } } }); //... }
fuente
toolbar.setNavigationOnClickListener
requiere un nivel mínimo de API 21 :(From August 2018, new apps must target at least Android 8.0 (API level 26). From November 2018, app updates must target Android 8.0 (API level 26).
(Google)Esta respuesta es útil para configurar la navegación abierta de derecha a izquierda, pero no tiene una solución para configurar su icono en el lado derecho. Este código puede solucionarlo. Si le da
drawer
como primer parámetro yViewCompat.LAYOUT_DIRECTION_RTL
como segundo parámetro, el diseño de entrada se establecerá en RTL. Es una solución rápida y simple, pero no creo que pueda ser una solución correcta para quienes solo quieren configurar el menú para que se abra 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 el entoolbar
lugar deldrawer
. De esta forma, solo la barra de herramientas se ha convertido en RTL. Entonces creo que la combinación de estas 2 respuestas puede hacer exactamente lo que quieras.Según 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 hacer que el cajón sea final, de lo contrario obtendrá este error:
Y no olvides usar en
end
lugar destart
en elonNavigationItemSelected
método:drawer.closeDrawer(GravityCompat.END);
y en su activity_main.xml
<android.support.v4.widget.DrawerLayout android:id="@+id/drawer_layout" tools:openDrawer="end"> <android.support.design.widget.NavigationView android:id="@+id/nav_view" android:layout_gravity="end"/> </android.support.v4.widget.DrawerLayout>
fuente
Aquí está la documentación en el cajón y parece que puede configurarlo para extraerlo desde la izquierda o la derecha.
http://developer.android.com/reference/android/support/v4/widget/DrawerLayout.html
fuente
end
lugar deright
en la gravedad. EDITAR: quitarandroid:layout_gravity="right"
delandroid.support...DrawerLayout
y cambiarandroid:layout_gravity="right"
alandroid:layout_gravity="end"
interiorListView
Eche un vistazo a esto: deslice ExpandableListView en el formulario DrawerLayout de derecha a izquierda
Supongo que tiene implementado ActionBarDrawerToggle, el truco es anular el
onOptionsItemSelected(MenuItem item)
método 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)
la Actividad:@Override public boolean onOptionsItemSelected(MenuItem item) { if(mDrawerToggle.onOptionsItemSelected(item)) { return true; } return super.onOptionsItemSelected(item); }
Esto le permitirá utilizar la función del botón de inicio. Para mover el botón al lado derecho de la barra de acción, tendrá que implementar un elemento de acción personalizado y tal vez algunas otras cosas para que funcione como desea.
fuente
el problema principal con el siguiente error:
no se encontró vista de cajón con gravedad absoluta IZQUIERDA
es que, definiste el
android:layout_gravity="right"
para la vista de lista 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 hamburguesa!
¡solo comente la función anterior e intente manejar abrir / cerrar el menú como dijo @Rudi!
fuente
He resuelto este problema cambiando la gravedad de la vista de navegación
para terminar en lugar de inicio
<android.support.design.widget.NavigationView android:id="@+id/nav_view" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="end" android:fitsSystemWindows="true" app:headerLayout="@layout/nav_header" app:menu="@menu/activity_drawer" />
Funcionó para mí.
fuente
Primero 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, coloque este fragmento de código:
android:layout_direction="rtl"
fuente
Hice la siguiente modificación al ejemplo de 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/ ):
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/action_right_drawer" android:title="Drawer menu" android:icon="@drawable/ic_menu_white_24px" android:orderInCategory="100" app:showAsAction="always" /> </menu>
En activity_main.xml cambiar
android:layout_gravity="start"
a
android:layout_gravity="end"
fuente
Abrirlo desde rtl no es bueno para la experiencia del usuario, para que responda 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 que el diseño de la hamburguesa también coincida con la dirección de apertura del cajón.
fuente
Propiedades de DrawerLayout
android:layout_gravity="right|end"
y propiedadtools:openDrawer="end"
NavigationViewandroid:layout_gravity="end"
XML Layout
<?xml version="1.0" encoding="utf-8"?> <androidx.drawerlayout.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_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" android:layout_gravity="right|end" tools:openDrawer="end"> <include layout="@layout/content_main" /> <com.google.android.material.navigation.NavigationView android:id="@+id/nav_view" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="end" android:fitsSystemWindows="true" app:headerLayout="@layout/nav_header_main" app:menu="@menu/activity_main_drawer" /> </androidx.drawerlayout.widget.DrawerLayout>
Java Code
// Appropriate Click Event or Menu Item Click Event if (drawerLayout.isDrawerOpen(GravityCompat.END)) { drawerLayout.closeDrawer(GravityCompat.END); } else { drawerLayout.openDrawer(GravityCompat.END); } //With Toolbar 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) { //Gravity.END or Gravity.RIGHT if (drawer.isDrawerOpen(Gravity.END)) { drawer.closeDrawer(Gravity.END); } else { drawer.openDrawer(Gravity.END); } } }); //... }
fuente