67 votes

Android - Est-il possible de faire apparaître le tiroir de navigation sur le côté droit ?

http://developer.Android.com/training/implementing-navigation/nav-drawer.html

Selon cette documentation, il n'est pas dit s'il est possible de mettre en œuvre un tiroir à partir du côté droit. Est-ce même possible ? :(

0 votes

Vérifier cette réponse : stackoverflow.com/a/17792254/1572408 cela fonctionne pour moi.

69voto

Jeshurun Points 7257

Le NavigationDrawer peut être configuré pour s'extraire par la gauche, la droite ou les deux. La clé est l'ordre d'apparition des tiroirs dans la déclaration XML, et l'attribut layout_gravity. Voici un exemple :

<android.support.v4.widget.DrawerLayout
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <FrameLayout
        android:id="@+id/content"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:baselineAligned="false" >
    </FrameLayout>

    <!-- Left drawer -->

    <ListView
        android:id="@+id/left_drawer"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="left"
        android:choiceMode="singleChoice" />

    <!-- Right drawer -->

    <ListView
        android:id="@+id/right_drawer"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="right"
        android:choiceMode="singleChoice" />
</android.support.v4.widget.DrawerLayout>

47voto

Larry McKenzie Points 1852

Voici la documentation sur le tiroir et il apparaît que vous pouvez le configurer pour qu'il s'ouvre à gauche ou à droite.

Le positionnement et la disposition du tiroir sont contrôlés à l'aide de la fonction l'attribut Android:layout_gravity sur les vues enfant correspondant au côté de la vue sur lequel vous souhaitez que le tiroir soit positionné. côté de la vue d'où vous voulez que le tiroir émerge : gauche ou droite. (Ou début/fin sur les versions de la plate-forme qui prennent en charge la direction de la disposition).

http://developer.Android.com/reference/Android/support/v4/widget/DrawerLayout.html

0 votes

Comment se fait-il que leur exemple ne fonctionne pas dans mon cas ? Je veux dire, je l'ai mis en hébreu, et je ne vois pas qu'il va sur le côté droit.

0 votes

Je vais avoir besoin de plus pour continuer. Vous êtes sûr que tout est configuré correctement ? Je vous recommande de poster une nouvelle question.

0 votes

J'ai décidé de laisser tomber. J'ai réussi à faire fonctionner leur projet en utilisant d'autres choses, puis j'ai décidé de ne pas l'utiliser car cela pourrait prêter à confusion d'avoir le tiroir de navigation de l'autre côté. Peut-être changerai-je d'avis plus tard.

25voto

amalBit Points 3406

Mon application s'est plantée avec l'erreur "No drawer view found with gravity LEFT".

J'ai donc ajouté ceci au onOptionsItemSelected :

if (item != null && item.getItemId() == android.R.id.home) {
        if (mDrawerLayout.isDrawerOpen(Gravity.RIGHT)) {
            mDrawerLayout.closeDrawer(Gravity.RIGHT);
        } else {
            mDrawerLayout.openDrawer(Gravity.RIGHT);
        }
    }

5voto

sandalone Points 8326

À ajouter à https://stackoverflow.com/a/21781710/437039 solution.

Si vous utilisez le projet Navigation Drawer créé par Android Studio, alors les choses vont changer dans onOptionsItemSelected . Comme ils ont créé la classe enfant, vous devez utiliser ce code

if (item != null && id == android.R.id.home) {
        if (mNavigationDrawerFragment.isDrawerOpen(Gravity.RIGHT)) {
            mNavigationDrawerFragment.closeDrawer(Gravity.RIGHT);
        } else {
            mNavigationDrawerFragment.openDrawer(Gravity.RIGHT);
        }
        return true;
}

Suivant. En classe NavigationDrawerFragment vous devez créer 3 méthodes :

Méthode 1

public boolean isDrawerOpen(int gravity) {
    return mDrawerLayout != null && mDrawerLayout.isDrawerOpen(gravity);
}

Méthode 2

public void closeDrawer(int gravity) {
    mDrawerLayout.closeDrawer(gravity);
}

Méthode 3

public void openDrawer(int gravity) {
    mDrawerLayout.openDrawer(gravity);
}

Seulement maintenant, le tiroir du côté droit fonctionne.

1voto

Rohit Goswami Points 305

Ensuite, utilisez ces codes @amal, je pense que cela va vous aider. XML :

<!-- Framelayout to display Fragments -->

<FrameLayout
    android:id="@+id/frame_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="48dp"
        android:background="@drawable/counter_bg" >

        <ImageView
            android:id="@+id/iconl"
            android:layout_width="25dp"
            android:layout_height="wrap_content"
            android:layout_gravity="left"
            android:layout_marginLeft="12dp"
            android:layout_marginRight="12dp"
            android:src="@drawable/ic_launcher" />

        <ImageView
            android:id="@+id/iconr"
            android:layout_width="25dp"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_alignParentTop="true"
            android:layout_marginRight="17dp"
            android:src="@drawable/ic_launcher" />
    </RelativeLayout>
</FrameLayout>

<!-- Listview to display slider menu -->

<ListView
    android:id="@+id/list_slidermenu"
    android:layout_width="240dp"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:background="@color/list_background"
    android:choiceMode="singleChoice"
    android:divider="@color/list_divider"
    android:dividerHeight="1dp"
    android:listSelector="@drawable/list_selector" />

<ListView
    android:id="@+id/list_slidermenu2"
    android:layout_width="240dp"
    android:layout_height="match_parent"
    android:layout_gravity="end"
    android:background="@color/list_background"
    android:choiceMode="singleChoice"
    android:divider="@color/list_divider"
    android:dividerHeight="1dp"
    android:listSelector="@drawable/list_selector" />

//set les images requises

Code d'activité :

ImageView iconl,iconr;

private DrawerLayout mDrawerLayout;
private ListView mDrawerList,mDrawerList2;

ImageView iconl,iconr;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    iconl = (ImageView)findViewById(R.id.iconl);
    iconr = (ImageView)findViewById(R.id.iconr);

    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    mDrawerList = (ListView) findViewById(R.id.list_slidermenu);
    mDrawerList2 = (ListView) findViewById(R.id.list_slidermenu2);
    mDrawerList.setOnItemClickListener(new SlideMenuClickListener());
    mDrawerList2.setOnItemClickListener(new SlideMenuClickListener());
    iconl.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            mDrawerLayout.openDrawer(Gravity.START);
            mDrawerLayout.closeDrawer(Gravity.END);
        }
    });
    iconr.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            mDrawerLayout.openDrawer(Gravity.END);
            mDrawerLayout.closeDrawer(Gravity.START);
        }
    });
}
}

et ici vous pouvez définir votre propre adaptateur de liste pour les deux listes et sur le clic de l'élément appeler la méthode displayView(position) ; où vous pouvez ajouter votre fragment à framelayout.

/**
 * Diplaying fragment view for selected nav drawer list item
 * */
private void displayView(int position) {
    // update the main content by replacing fragments
    Fragment fragment = null;
    switch (position) {
    case 0:
        fragment = new HomeFragment();
        break;

    default:
        break;
    }

    if (fragment != null) 
    {
        FragmentManager fragmentManager = getFragmentManager();
        fragmentManager.beginTransaction()
        .replace(R.id.frame_container, fragment).commit();

        // update selected item and title, then close the drawer
        mDrawerList.setItemChecked(position, true);
        mDrawerList.setSelection(position);

        mDrawerLayout.closeDrawer(mDrawerList);
    } else {
        // error in creating fragment
        Log.e("MainActivity", "Error in creating fragment");
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X