Quand je clique sur mon tiroir, je reçois l'exception suivante
Java.lang.IllegalArgumentException: aucune vue de tiroir trouvée avec la gravité LA GAUCHE
C'est mon activité_drawer.xml
<?xml version="1.0" encoding="utf-8"?>
<Android.support.v4.widget.DrawerLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
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">
<LinearLayout
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="vertical">
<Android.support.v7.widget.Toolbar
Android:id="@+id/toolbar"
Android:layout_height="wrap_content"
Android:layout_width="match_parent"
Android:minHeight="?attr/actionBarSize"
Android:background="?attr/colorPrimary"/>
<FrameLayout
Android:id="@+id/content"
Android:layout_width="match_parent"
Android:layout_height="match_parent"/>
<fragment
Android:id="@+id/navigation"
Android:layout_width="240dp"
Android:layout_height="match_parent"
Android:layout_gravity="start"
Android:name="com.xyz.ui.navigation.NavigationFragment"
tools:layout="@layout/fragment_navigation" />
</LinearLayout>
</Android.support.v4.widget.DrawerLayout>
Mon fragment_navigation.xml
<?xml version="1.0" encoding="utf-8"?>
<ListView
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:layout_gravity="start">
</ListView>
Et mon article de liste
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:orientation="vertical" Android:layout_width="match_parent"
Android:layout_height="match_parent">
<TextView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:textAppearance="?android:attr/textAppearanceLarge"
Android:text="Large Text"
Android:id="@+id/navigation_item_text"
Android:layout_gravity="center_horizontal" />
</LinearLayout>
De la documentation
Pour utiliser DrawerLayout, positionnez votre vue de contenu principale en tant que premier enfant avec une largeur et une hauteur de match_parent. Ajoutez des tiroirs en tant que vues enfants après la vue de contenu principale et définissez correctement layout_gravity. Les tiroirs utilisent généralement match_parent pour une hauteur fixe.
<Android.support.v4.widget.DrawerLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
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">
<LinearLayout
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="vertical">
<Android.support.v7.widget.Toolbar
Android:id="@+id/toolbar"
Android:layout_height="wrap_content"
Android:layout_width="match_parent"
Android:minHeight="?attr/actionBarSize"
Android:background="?attr/colorPrimary"/>
<FrameLayout
Android:id="@+id/content"
Android:layout_width="match_parent"
Android:layout_height="match_parent"/>
</LinearLayout>
<fragment
Android:id="@+id/navigation"
Android:layout_width="240dp"
Android:layout_height="match_parent"
Android:layout_gravity="right"
Android:name="com.xyz.ui.navigation.NavigationFragment"
tools:layout="@layout/fragment_navigation" />
</Android.support.v4.widget.DrawerLayout>
D'accord. Laissez-moi rendre les choses simples et claires ici .
Qu'est-ce que DrawerLayout
?https://developer.Android.com/reference/Android/support/v4/widget/DrawerLayout.html
DrawerLayout
Agit comme un conteneur de niveau supérieur pour le contenu de la fenêtre qui autorise vues interactives du "tiroir" à extraire du bord du la fenêtre. Le positionnement et la disposition des tiroirs sont contrôlés à l'aide du Android:layout_gravity
attribuez sur les vues enfant correspondant à quel côté de la vue vous veux que le tiroir sorte: gauche ou droite. (Ou début/fin sur les versions de la plate-forme Qui prennent en charge le sens de la disposition.) Pour utiliser un DrawerLayout
, positionnez votre vue de contenu principale en tant que premier enfant avec une largeur et hauteur de match_parent
. Ajoutez des tiroirs en tant que vues enfants après la vue du contenu principal et définissez le layout_gravity
de manière appropriée. Les tiroirs utilisent couramment match_parent
pour une hauteur avec une largeur fixe .
DrawerLayout
?, En termes simples:Android:layout_gravity="start"
OR Android:layout_gravity="left"
DrawerLayout mDrawerLayout = (DrawerLayout) findViewById (R.id.drawerLayout); ActionBarDrawerToggle mDrawerToggle = new ActionBarDrawerToggle (this, mDrawerLayout, Toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close) mDrawerLayout.setDrawerListener (mDrawerToggle);
toggle()
Privé void toggle () { if (mDrawerLayout.isDrawerVisible (GravityCompat.START)) { mDrawerLayout.closeDrawer (GravityCompat.START); } autre { mDrawerLayout.openDrawer (GravityCompat.START); } }
/ ** Amener l'objet à la position de l'axe des x au début de son conteneur. ne pas changer de taille. */ public static final int START = RELATIVE_LAYOUT_DIRECTION | Gravity.LEFT;
Toggle()
appelle la mDrawerLayout.openDrawer(Gravity.START)
/*** Ouvre le tiroir spécifié en l'animant hors de vue. ** @param gravity Gravity.LEFT pour déplacer le tiroir de gauche ou Gravity.RIGHT pour le droit. * GravityCompat.START ou GravityCompat.END peuvent également être utilisé. */ public void openDrawer (@EdgeGravity int gravity) { vue finale drawView = findDrawerWithGravity (gravité); if (drawView == null) { jette new IllegalArgumentException ("Aucune vue de tiroir trouvée avec la gravité" + gravityToString (gravity)); } openDrawer (drawView); }
layout_gravity="start”
ou le left
, le No drawer view found with gravity LEFT
est levé . <Android.support.v4.widget.DrawerLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
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">
<!--This will appear when the drawer is closed (default view)-->
<LinearLayout
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="vertical">
<Android.support.v7.widget.Toolbar
Android:id="@+id/toolbar"
Android:layout_height="wrap_content"
Android:layout_width="match_parent"
Android:minHeight="?attr/actionBarSize"
Android:background="?attr/colorPrimary" />
</LinearLayout>
<!-- This will appear when the drawer is opened -->
<!-- the property,Android:layout_gravity, is used internally to identify imageView as the view to be displayed when the drawer is opened -->
<ImageView
Android:id="@+id/imageView"
Android:layout_width="match_parent"
Android:layout_height=" match_parent"
Android:layout_gravity="left"
Android:background="@drawable/img_shree_ganesha" />
</Android.support.v4.widget.DrawerLayout>
I hope that helps. Happy Coding…
Le "tiroir Android" doit être un noeud enfant direct du "DrawerLayout".
Dans votre exemple ci-dessus (exemple: question d'origine), vous n'avez qu'un seul noeud enfant direct sous "DrawerLayout" ("LinearLayout"), et aucune vue de tiroir après.
Déplacez la vue de votre tiroir hors de votre LinearLayout et placez-la après.
dans mon cas, parce que DrawerLayout attr: tools:openDrawer="start"
i ajouté Android:layout_gravity="start"
pour le deuxième élément
<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"
tools:openDrawer="right"
tools:context=".map.MapFragment">
<include layout="@layout/fragment_map" />
<FrameLayout
Android:id="@+id/content_frame"
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="right"
Android:background="@color/white"
Android:fitsSystemWindows="true"
app:menu="@menu/drawer_view"
app:headerLayout="@layout/drawer_nav_header"/>
</Android.support.v4.widget.DrawerLayout>
Utilisez-vous une disposition de droite à gauche (RTL)? La définition de la gravité laissée sur la présentation RTL lève cette exception. Cela peut être corrigé en réglant le début de gravité au lieu de gauche
Vous devez utiliser la même gravité dans DrawerLayout et NavigationView: par exemple: tools: openDrawer = "right" dans la balise DrawerLayout et Android: layout_gravity = "right" dans la balise NavigationView
<?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"
tools:openDrawer="right"
tools:context=".map.MapFragment">
<include layout="@layout/fragment_map" />
<FrameLayout
Android:id="@+id/content_frame"
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="right"
Android:background="@color/white"
Android:fitsSystemWindows="true"
app:menu="@menu/drawer_view"
app:headerLayout="@layout/drawer_nav_header"/>
</Android.support.v4.widget.DrawerLayout>
Si vous vérifiez de plus près, vous remarquerez qu'il existe effectivement deux éléments de niveau supérieur: LinearLayout et fragment.
Java.lang.IllegalArgumentException: aucune vue de tiroir trouvée avec gravité LEFT
SOLUTION Attribuez un attribut layout_gravity = "start" ou "left" à l'un de vos vues enfant DrawerLayout si la disposition de vos tiroirs a déjà une vue enfant. OU Créez simplement une vue enfant dans votre vue DrawerLayout et attribuez-lui un layout_gravity = "start" ou "left" attribut . par exemple
<?xml version="1.0" encoding="utf-8"?>
<Android.support.design.widget.CoordinatorLayout 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:layout_width="match_parent"
Android:layout_height="match_parent"
Android:id="@+id/mDrawer_Layout"
tools:context="com.rad5.matdesign.MainActivity">
<Android.support.design.widget.CoordinatorLayout
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<Android.support.v4.widget.DrawerLayout
Android:id="@+id/drawer_layout"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:fitsSystemWindows="true"
tools:openDrawer="start">
<!-- Notice that here an image view as a child of the Drawer layout was -->
<!-- given a layout_gravity="start" -->
<ImageView
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_gravity="start"/>
</Android.support.v4.widget.DrawerLayout>
<Android.support.design.widget.AppBarLayout
Android:id="@+id/appBar"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
<Android.support.v7.widget.Toolbar
Android:id="@+id/toolbar"
Android:layout_width="match_parent"
Android:layout_height="?attr/actionBarSize"
Android:background="?attr/colorPrimary"/>
<Android.support.design.widget.TabLayout
Android:id="@+id/tabs"
Android:layout_width="match_parent"
Android:layout_height="wrap_content" />
</Android.support.design.widget.AppBarLayout>
<Android.support.v4.view.ViewPager
Android:id="@+id/viewpager"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
</Android.support.design.widget.CoordinatorLayout>
<Android.support.design.widget.NavigationView
Android:id="@+id/nav_view"
Android:layout_width="wrap_content"
Android:layout_height="match_parent"
Android:fitsSystemWindows="true"
app:headerLayout="@layout/nav_header"
app:menu="@menu/menu_navigation_items" />
</Android.support.design.widget.CoordinatorLayout>