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
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.
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.)
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);
Essayez de déplacer Android:id="@+id/left_drawer"
au LinearLayout au lieu du ListView