Mon besoin est genre de l'image ci-dessous Mon tiroir de navigation doit être ouvert du côté droit. J'ai implémenté ceci. Mon tiroir de navigation s’ouvre de droite à gauche. Mais le problème est que l'icône bascule est toujours sur le côté gauche. Comment puis-je régler l’icône de bascule à droite. J'ai vérifié la question SO suivante, mais aucune d’elles n’est venue à l’aide.
Changer l’icône du bouton bascule Icône dans le tiroir de navigation de droite à gauche
Tiroir Basculer dans le tiroir droit
entrez la description du lien ici
Voici ce que j'ai essayé.
code pour ma mise en page 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>
Code pour mon activité
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);
}
}
});
}
}
Merci d'avance.
J'ai écrit la classe EndDrawerToggle
pour une configuration très similaire à la vôtre - une DrawerLayout
avec un tiroir aligné à la fin View
, dans une AppCompatActivity
avec une personnalisation Toolbar
comme support 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 classe EndDrawerToggle
est un remplacement complet de ActionBarDrawerToggle
dans ce cas, vous n'aurez donc besoin d'aucune des configurations que vous avez actuellement pour cela. Toutes les méthodes DrawerListener
sont toujours disponibles pour le remplacement, mais il n'est pas nécessaire de le faire pour les fonctionnalités de base, car EndDrawerToggle
gère le basculement de l'état du tiroir. De même, il est inutile de manipuler le clic de basculement vous-même, vous n'avez donc pas besoin de la navigation OnClickListener
.
Installez simplement la bascule, ajoutez-la en tant que DrawerListener
et synchronisez-la. Je recommanderais de synchroniser la bascule dans la méthode onPostCreate()
afin de s’assurer qu’elle se synchronise correctement, par exemple, après un changement d’orientation.
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();
}
Dans votre manifeste Android, ajoutez cette ligne:
Android:supportsRtl="true"
à votre application, comme si:
<application
Android:allowBackup="true"
Android:icon="@mipmap/ic_launcher"
Android:label="@string/app_name"
Android:supportsRtl="true"
Ensuite, dans votre méthode onCreate, ajoutez cette ligne:
getWindow().getDecorView().setLayoutDirection(View.LAYOUT_DIRECTION_RTL);
WARNING ::: Ceci ne fonctionne que pour SdkVersion 17+. Ainsi, si votre application cible un SDK minimum plus bas, vous devrez créer un menu personnalisé et remplacer la méthode OnCreateOptions certainement possible).
https://developer.Android.com/guide/topics/manifest/application-element.html#supportsrtl