web-dev-qa-db-fra.com

Comment configurer le tiroir de navigation pour s’ouvrir de droite à gauche

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>
73
galvan

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 :)

149
Rudi

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. ;)

56
Amir Bax

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);
            }
        }
    });
//...
}
35
Volodymyr Kulyk

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

2
KickAss

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"
2
Shabnam Esmaeili

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.

2
d370urn3ur

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!

2
par4301

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.

2
Abdulaziz Alnahhas

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>
2

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"
1
Mathias Jeppsson

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.

1
Arbel Israeli