web-dev-qa-db-fra.com

Android DrawerLayout - Aucune vue de tiroir trouvée avec gravité

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>
22
Tobias

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>
18
Dmytro


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 . 


Qu'est-ce que DrawerLayout ?, En termes simples:
  • La mise en page prise en charge par Android qui vous permet d’avoir un écran superposé, appelé tiroir, sur votre écran principal.
  • DrawerLayout a besoin de vues d'enfant pour fonctionner, similaires à LinearLayout et RelativeLayout.
  • La vue enfant doit avoir l'une des propriétés définies
    Android:layout_gravity="start" OR Android:layout_gravity="left" 
  • DrawerLayout utilise cette vue enfant pour savoir d'où commencer à montrer le tiroir c'est-à-dire de gauche à droite ou de droite à La gauche. Il y a des pays où le texte est lu de droite à gauche . 


Techie Stuff:
  • ÉVÉNEMENT 1: ActionBarDrawerToggle.Java est défini comme écouteur de tiroir pour DrawerLayout.
  •  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); 
     
  • ÉVÉNEMENT n ° 2: l'utilisateur clique sur le Toolbar.navigationIcon qui appelle la fonction toggle()
    ActionBarDrawerToggle.Java (Android-sdk\sources\Android-22\Android\support\v7\app\ActionBarDrawerToggle.Java)
     Privé void toggle () {
     if (mDrawerLayout.isDrawerVisible (GravityCompat.START)) {
     mDrawerLayout.closeDrawer (GravityCompat.START); 
     } autre {
     mDrawerLayout.openDrawer (GravityCompat.START); 
     } 
     } 
     

    Gravity.Java(Android-sdk\sources\Android-22\Android\view\Gravity.Java)
    / ** 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; 
     
  • ÉVÉNEMENT 3: La fonction Toggle() appelle la mDrawerLayout.openDrawer(Gravity.START) 
    DrawerLayout.Java (bibliothèque support-v4-22.1.1.jar)
    /*** 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); 
     } 
     
  • ÉVÉNEMENT N ° 4: Si aucun childView de DrawerLayout n'est défini avec le layout_gravity="start” ou le left, le No drawer view found with gravity LEFT est levé . 

Solution:
    <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…
13
Devendra Vaja

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.

6
WindSpirit

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>
4
itzhar

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

1
user1474089

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>
0
Maryam Azhdari

Si vous vérifiez de plus près, vous remarquerez qu'il existe effectivement deux éléments de niveau supérieur: LinearLayout et fragment.

0
asiby

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>
0
Peter