web-dev-qa-db-fra.com

Est-il possible d'utiliser autre chose qu'une vue de liste comme tiroir coulissant dans la disposition des tiroirs

J'aimerais avoir par exemple un LinearLayout ou un RelativeLayout glissant depuis la gauche de l'écran au lieu d'un seul ListView.

J'ai essayé d'utiliser à LinearLayout avec Android:layout_gravity="start" et j'ai eu cette erreur lors de l'exécution:

ClassCastException: Android.widget.LinearLayout$LayoutParams cannot 
be cast to Android.support.v4.widget.DrawerLayout$LayoutParams

voici le fichier de mise en page:

<Android.support.v4.widget.DrawerLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/drawer_layout"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:background="@Android:color/white"
    >

    <FrameLayout
        Android:id="@+id/content_frame"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent" />

    <LinearLayout 
        Android:layout_width="320dp"
        Android:layout_height="match_parent"
        Android:layout_gravity="start"
        Android:orientation="vertical">

        <ImageView 
            Android:id="@+id/ivwLogo"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:src="@drawable/video_icon"
        />

        <ListView 
            Android:id="@+id/left_drawer"
            Android:layout_width="320dp"
            Android:layout_height="match_parent"
            Android:choiceMode="singleChoice"
            Android:divider="@Android:color/transparent"
            Android:dividerHeight="0dp"
            Android:background="@Android:color/white"
        />

    </LinearLayout>
</Android.support.v4.widget.DrawerLayout>

Merci

34
BigDan

Oui, il est possible d'avoir n'importe quelle vue comme partie coulissante d'une disposition de tiroir. Je préfère déclarer un FrameLayout comme tiroir et le remplacer par mon fragment, et cela fonctionne très bien.

L'erreur que vous obtenez est probablement due à une autre raison dans la partie Java de votre implémentation.

26
Samarth Jain

Cela fonctionnera si vous déplacez à la fois le Android:id="@+id/left_drawer" (Ou créez un nouvel identifiant) et définissez la gravité.

L'identifiant move (ou nouveau) est donc la référence est correcte donc vous appelez closeDrawer() dessus et non les vues enfants.

Mais plus important encore, le DrawerLayout requiert que cet élément ait un Android:layout_gravity Défini dessus, comme vous l'avez mentionné.

Enfin, vous devez appeler close closeDrawer() sur la vue de base, celle avec la gravité requise.

Exemple:

<Android.support.v4.widget.DrawerLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/drawer_layout"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:background="@Android:color/white">

    <FrameLayout
        Android:id="@+id/content_frame"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent" />

    <LinearLayout 
        Android:id="@+id/left_drawer"
        Android:layout_width="320dp"
        Android:layout_height="match_parent"
        Android:layout_gravity="start"
        Android:orientation="vertical">

        <ImageView 
            Android:id="@+id/ivwLogo"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:src="@drawable/video_icon" />

        <ListView 
            Android:id="@+id/left_drawer_child"
            Android:layout_width="match_parent"
            Android:layout_height="match_parent"
            Android:choiceMode="singleChoice"
            Android:divider="@Android:color/transparent"
            Android:dividerHeight="0dp"
            Android:background="@Android:color/white" />

    </LinearLayout>
</Android.support.v4.widget.DrawerLayout>

Dans du code:

DrawerLayout mDrawer = (DrawerLayout) findViewById(R.id.drawer_layout)
LinearLayout mDrawerLinear = (LinearLayout) findViewById(R.id.left_drawer);
ListView mDrawerListChild = (ListView) findViewById(R.id.left_drawer_child);

...

mDrawer.closeDrawer(mDrawerLinear);

(C'est essentiellement ce que @Karakuri a publié, mais avec une explication et un exemple plus complets.)

63
Jon Adams

Assurez-vous de passer l'objet correct (votre LinearLayout appelé mDrawerLinear) pour des méthodes comme isDrawerOpen, closeDrawer etc. Cette ligne a résolu mon ClassCastException:

boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerLinear);
7
Roman

Essayez de déplacer Android:id="@+id/left_drawer" au LinearLayout au lieu du ListView

2
Karakuri