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>
67
demandé sur Community 2013-08-31 14:44:28

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

142
répondu Rudi 2015-12-23 14:08:18

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

54
répondu Amir Bax 2014-10-08 18:59:51

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);
            }
        }
    });
//...
}
29
répondu Volodymyr Kulyk 2016-11-23 08:36:02

, 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

2
répondu KickAss 2013-08-31 11:37:25

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"
2
répondu Shabnam Esmaeili 2015-12-26 15:43:54

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!

2
répondu par4301 2016-02-11 04:47:38

j'ai résolu ce problème en changeant la gravité du navigationview en end au lieu de start et ça marche pour moi

2
répondu Abdulaziz Alnahhas 2017-01-01 13:40:08

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.

1
répondu d370urn3ur 2017-05-23 12:02:47

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"
1
répondu Mathias Jeppsson 2017-04-07 00:26:51

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.

1
répondu Arbel Israeli 2017-08-25 16:01:35

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>
1
répondu Reyhaneh Sharifzadeh 2018-06-11 14:03:48