Tout d'abord, je sais que cette question a déjà été abordée auparavant, mais après avoir essayé beaucoup, je n'ai toujours pas réussi. Je travaille sur l'exemple de site Android Developers .
J'essaie de régler le menu pour qu'il soit ouvert de droite à gauche au lieu de son implémentation dans l'exemple (de gauche à droite). De plus, je souhaite déplacer le bouton de menu ouvert vers la droite de la barre d’action. J'ai aussi lu quelques réponses ici, par exemple dans cette réponse .
J'essaie de changer la gravité des vues et des mises en page mais j'obtiens l'erreur:
aucune vue de tiroir trouvée avec une gravité absolue GAUCHE
Pouvez-vous m'aider à comprendre quel est le problème dans mon code et que dois-je changer pour que le menu soit ouvert de la droite et que le bouton de la barre d'action soit placé du côté droit?
le code XML est ici:
<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>
Dans votre mise en page principale, réglez votre gravité ListView
à droite:
Android:layout_gravity="right"
Aussi dans votre code:
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;
}
};
esperons que ça marche :)
Ajoutez ce code au manifeste:
<application Android:supportsRtl="true">
puis écrivez ce code sur Oncreate:
getWindow().getDecorView().setLayoutDirection(View.LAYOUT_DIRECTION_RTL);
Ça marche pour moi. ;)
SOLUTION
votre_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>
Votre activité.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);
}
}
});
//...
}
Voici la documentation sur le tiroir et il semble que vous puissiez le configurer pour s’extraire de la gauche ou de la droite.
Le positionnement et la disposition du tiroir sont contrôlés à l'aide de l'attribut Android: layout_gravity sur les vues enfant correspondant au côté de la vue duquel vous souhaitez que le tiroir sorte: à gauche ou à droite. (Ou bien commencez/arrêtez-vous sur les versions de plate-forme prenant en charge la direction de la disposition.)
http://developer.Android.com/reference/Android/support/v4/widget/DrawerLayout.html
Vous devez d’abord placer ce code dans votre fichier AppManifest.xml dans la balise d’application:
Android:supportsRtl="true"
puis dans votre fichier activity_main.xml, mettez ce morceau de code:
Android:layout_direction="rtl"
Jetez un coup d'oeil à ceci: glissez ExpandableListView dans le formulaire DrawerLayout de droite à gauche
Je suppose que vous avez implémenté ActionBarDrawerToggle, le truc consiste à écraser la méthode onOptionsItemSelected(MenuItem item)
à l'intérieur de l'objet ActionBarDrawerToggle avec ceci:
@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;
}
assurez-vous et appelez ceci de onOptionsItemSelected(MenuItem item)
dans l'activité:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if(mDrawerToggle.onOptionsItemSelected(item)) {
return true;
}
return super.onOptionsItemSelected(item);
}
Cela vous permettra d'utiliser la fonctionnalité du bouton d'accueil. Pour déplacer le bouton sur le côté droit de la barre d'action, vous devez implémenter un élément d'action personnalisé et peut-être d'autres éléments pour le faire fonctionner comme vous le souhaitez.
le problème principal avec l'erreur suivante:
aucune vue de tiroir trouvée avec une gravité absolue GAUCHE
est-ce que vous avez défini le
Android:layout_gravity="right"
pour list-view à droite, mais essayez d'ouvrir le tiroir de gauche en appelant cette fonction:
mDrawerToggle.syncState();
et en cliquant sur l'icône hamburger!
commentez simplement la fonction ci-dessus et essayez de gérer l'ouverture/la fermeture du menu comme @Rudi l'a dit!
J'ai résolu ce problème en modifiant la gravité de la navigationview
Android: layout_gravity
to end au lieu de start
<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" />
Cela a fonctionné pour moi.
Cette réponse est utile pour que la navigation soit ouverte de droite à gauche, mais il n'y a pas de solution pour définir son icône sur le côté droit. Ce code peut le réparer. Si vous lui donnez le drawer
comme premier paramètre et ViewCompat.LAYOUT_DIRECTION_RTL
comme deuxième paramètre, la mise en page entière sera définie sur RTL. C'est une solution simple et rapide, mais je ne pense pas que ce soit une solution correcte pour ceux qui souhaitent uniquement configurer le menu pour qu'il soit ouvert de droite à gauche et que son icône soit située à droite. (Bien que cela dépende de votre but.) Cependant, je suggère de donner le toolbar
au lieu du drawer
. De cette manière, seule la barre d’outils est devenue RTL. Je pense donc que la combinaison de ces 2 réponses peut faire exactement ce que vous voulez.
Selon ces descriptions, votre code devrait être comme ceci:
(Ajoutez ces lignes à la méthode 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);
}
});
Notez que vous devez rendre le tiroir final, sinon vous obtiendrez cette erreur:
La variable 'tiroir' est accessible depuis la classe interne, doit être déclarée finale
Et n'oubliez pas d'utiliser end
au lieu de start
dans la méthode onNavigationItemSelected
:
drawer.closeDrawer(GravityCompat.END);
et dans votre 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>
J'ai procédé à la modification suivante de l'exemple d'activité Navigation Drawer dans Android Studio. Avec les bibliothèques de support 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 (télécharger ic_menu_white_24px à partir de 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>
Dans activity_main.xml, changez
Android:layout_gravity="start"
à
Android:layout_gravity="end"
Le rendre ouvert à partir de RTL n'est pas bon pour l'expérience utilisateur, pour le rendre sensible aux paramètres régionaux de l'utilisateur, je viens d'ajouter la ligne suivante à mes paramètres DrawerLayout:
Android:layoutDirection="locale"
Je l'ai ajouté à mon AppBarLayout pour que la disposition des hamburgers corresponde également à la direction d'ouverture du tiroir.