Comment configurer le tiroir de Navigation à ouvrir de droite à gauche
tout d'abord je sais que cette question est apparue ici avant mais après avoir essayé beaucoup je n'ai toujours pas réussi. Je travaille sur l'exemple de site des Développeurs Android .
j'essaie de définir le menu à ouvrir de droite à gauche au lieu de la façon dont son implémentation dans l'exemple (de gauche à droite). En outre, je veux déplacer le bouton Ouvrir le menu sur le côté droit de la barre d'action. J'ai aussi rouge des réponses ici, par exemple cette réponse .
j'essaie de changer la gravité des vues et des mises en page mais j'obtiens l'erreur:
sans tiroir vue avec l'absolu de la gravité de la GAUCHE
pouvez-vous s'il vous plaît m'aider à comprendre quel est le problème dans mon code et ce que je dois changer afin de définir le menu à ouvrir à partir de la droite, et de déplacer le bouton de la barre d'action sur le côté droit?
le xml le code 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>
11 réponses
dans votre disposition principale, mettez votre ListView
gravity à 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;
}
};
j'espère que ça fonctionne :)
ajouter ce code au manifeste:
<application android:supportsRtl="true">
et ensuite écrire ce code sur Oncreate:
getWindow().getDecorView().setLayoutDirection(View.LAYOUT_DIRECTION_RTL);
ça me va. ;)
SOLUTION
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>
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 pouvez le configurer pour sortir de la gauche ou la droite.
le positionnement et la disposition des tiroirs sont contrôlés à l'aide de l'attribut android:layout_gravity sur les vues enfants correspondant au côté de la vue duquel vous souhaitez que le tiroir émerge: à gauche ou à droite. (Ou démarrer/terminer sur les versions de plate-forme qui prennent en charge la mise en page.)
http://developer.android.com/reference/android/support/v4/widget/DrawerLayout.html
vous devez d'abord mettre ce code dans votre AppManifest.xml dans la balise d'application:
android:supportsRtl="true"
puis dans votre domaine d'activité_.fichier xml, mettre ce morceau de code:
android:layout_direction="rtl"
le principal problème avec l'erreur suivante:
sans tiroir vue avec l'absolu de la gravité de la GAUCHE
est que, vous avez défini le
android:layout_gravity="right"
pour vue de liste à 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 ouvrez / fermez le menu comme @Rudi l'a dit!
j'ai résolu ce problème en changeant la gravité du navigationview en end au lieu de start et ça marche pour moi
Regardez ceci: slide ExpandableListView at DrawerLayout form right to left
je suppose que vous avez l'actionbardrawertoggle implémenté, le truc est de surcharger 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 cela 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 le bouton home fonctionnalité. Pour déplacer le bouton du côté droit de la barre d'action, vous aurez à mettre en œuvre un élément d'action personnalisé, et peut-être d'autres choses pour le faire fonctionner comme vous voulez.
j'ai fait la modification suivante à L'exemple D'activité de tiroir de Navigation dans Android Studio. Avec bibliothèques de support 25.3.1.
activité principale.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;
}
principal.xml (télécharger ic_menu_white_24px 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.changement xml
android:layout_gravity="start"
à
android:layout_gravity="end"
le faire ouvrir à partir de rtl n'est pas bon pour l'expérience utilisateur, pour le rendre sensible à la localisation de l'utilisateur je viens d'ajouter la ligne suivante à mes paramètres DrawerLayout:
android:layoutDirection="locale"
L'a ajouté à mon AppBarLayout pour que la disposition des hamburgers corresponde à la direction d'ouverture du tiroir.
cette réponse est utile pour définir la navigation être ouvert de droite à gauche, mais il n'a pas de solution pour définir son icône pour être côté droit. ce code peut le corriger. Si vous lui donnez le drawer
comme premier param et le ViewCompat.LAYOUT_DIRECTION_RTL
comme second param, le layout entier sera réglé sur RTL. C'est une solution rapide et simple, mais je ne pense pas que ce peut être une solution correcte pour qui veut seulement définir le menu à ouvrir de droite à gauche et de définir son icône sur le côté droit. (Bien que cela dépende de votre but.) Cependant, je suggère de donner le toolbar
au lieu du drawer
. De cette façon, juste la barre d'outils est devenue RTL. Donc je pense que la combinaison de ces deux réponses peut faire exactement ce que vous voulez.
selon ces descriptions, votre code devrait être comme ceci:
(ajouter 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 devriez faire le final de tiroir, sinon vous obtiendrez cette erreur:
"variable " tiroir" est accessible à partir de la classe interne, doit être déclaré final
et n'oubliez pas d'utiliser end
au lieu de start
dans onNavigationItemSelected
méthode:
drawer.closeDrawer(GravityCompat.END);
et dans votre domaine d'activité_.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>