it-swarm.com.de

Android DrawerLayout - Keine Schubladenansicht mit Schwerkraft gefunden

Wenn ich auf meinen Schubladenschalter klicke, bekomme ich die folgende Ausnahme

Java.lang.IllegalArgumentException: Es wurde keine Schubladenansicht mit der Schwerkraft .__ gefunden. LINKS

Dies ist meine activity_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>

Meine 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>

Und mein Listeneintrag

<?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

Aus der Dokumentation

Wenn Sie ein DrawerLayout verwenden möchten, positionieren Sie Ihre primäre Inhaltsansicht als erstes untergeordnetes Element mit einer Breite und Höhe von match_parent. Fügen Sie nach der Hauptinhaltsansicht Schubladen als untergeordnete Ansichten hinzu, und legen Sie die layout_gravity entsprechend fest. Schubladen verwenden normalerweise match_parent für die Höhe mit fester Breite.

<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


OK. Lassen Sie mich die Dinge hier einfach und klar machen . 
Was ist DrawerLayout?https://developer.Android.com/reference/Android/support/v4/widget/DrawerLayout.html

DrawerLayout Fungiert als Container der obersten Ebene für Fensterinhalt, der .__ zulässt. interaktive "Schubladen" -Ansichten, die aus dem Rand des .__ gezogen werden. Fenster. Die Positionierung und Anordnung der Schubladen wird mit dem Android:layout_gravity.__ gesteuert. Attribut für untergeordnete Ansichten, die der jeweiligen Seite der Ansicht entsprechen Die Schublade soll von links oder rechts auftauchen. (Oder Start/Ende bei Plattformversionen, die die Layoutrichtung unterstützen.) So verwenden Sie eine DrawerLayout, positionieren Sie Ihre primäre Inhaltsansicht als erstes untergeordnetes Element mit einer Breite und Höhe von match_parent. Fügen Sie nach der Hauptinhaltsansicht Schubladen als untergeordnete Ansichten hinzu, und legen Sie das .__ fest. layout_gravity entsprechend. Schubladen verwenden üblicherweise match_parent für die Höhe mit fester Breite . 


Was ist DrawerLayout?, In einfachen Worten:
  • Das von Android unterstützte Layout ermöglicht es Ihnen, einen Overlay-Bildschirm (Schublade) über Ihrem Hauptbildschirm anzuzeigen.
  • DrawerLayout benötigt zum Arbeiten eine Unteransicht, ähnlich wie LinearLayout und RelativeLayout.
  • Für die untergeordnete Ansicht muss eine der Eigenschaften festgelegt sein
    Android:layout_gravity="start" OR Android:layout_gravity="left" 
  • DrawerLayout verwendet diese childView, um es zu wissen von wo aus Sie die Schublade anzeigen lassen von links nach rechts oder nach rechts. Links. Es gibt Länder, in denen der Text von rechts nach links gelesen wird. 


Techie Stuff:
  • EVENT # 1: ActionBarDrawerToggle.Java wird als Drawer Listener für das DrawerLayout festgelegt
  •  DrawerLayout mDrawerLayout = (DrawerLayout) findViewById (R.id.drawerLayout); 
     ActionBarDrawerToggle mDrawerToggle = new ActionBarDrawerToggle (dies ist mDrawerLayout, 
     Symbolleiste, R.string.navigation_drawer_open, 
     R.string.navigation_drawer_close) 
     mDrawerLayout.setDrawerListener (mDrawerToggle); 
     
  • EVENT # 2: Der Benutzer klickt auf die Toolbar.navigationIcon, die die Funktion toggle() aufruft
    ActionBarDrawerToggle.Java (Android-SDK\Quellen\Android-22\Android\Support\v7\app\ActionBarDrawerToggle.Java)
     private void toggle () {
     if (mDrawerLayout.isDrawerVisible (GravityCompat.START)) {
     mDrawerLayout.closeDrawer (GravityCompat.START); 
     } else {
     mDrawerLayout.openDrawer (GravityCompat.START); 
     } 
     } 
     

    Schwerkraft.Java(Android-SDK\Quellen\Android-22\Android\Ansicht\Gravity.Java)
    / ** Objekt am Anfang des Containers in die x-Achsenposition verschieben, 
     seine Größe nicht ändern. */
     public static final int START = RELATIVE_LAYOUT_DIRECTION | Schwerkraft.LEFT; 
     
  • EVENT # 3: Toggle() Funktion ruft die mDrawerLayout.openDrawer(Gravity.START).__ auf. 
    DrawerLayout.Java (support-v4-22.1.1.jar-Bibliothek)
    /*** Öffnen Sie die angegebene Schublade, indem Sie sie außerhalb des Sichtbereichs animieren. ** 
     @param Schwerkraft Gravity.LEFT, um die linke Schublade oder Gravity.RIGHT .__ zu verschieben. für das Recht * GravityCompat.START oder GravityCompat.END kann auch 
     verwendet werden. */
     public void openDrawer (@EdgeGravity in der Schwerkraft) {
     Endansicht drawerView = findDrawerWithGravity (Schwerkraft); 
     if (drawerView == null) {
     Neue IllegalArgumentException werfen ("Keine Schubladenansicht mit der Schwerkraft gefunden" + 
     gravityToString (Schwerkraft)); 
     } 
     openDrawer (drawerView); 
     } 
     
  • EVENT # 4: Wenn keine childView des DrawerLayout mit layout_gravity="start” oder left festgelegt ist, wird der No drawer view found with gravity LEFT geworfen . 

Lösung:
    <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

Der "Android Drawer" muss ein direkter Kindknoten des "DrawerLayout" sein.

In Ihrem Beispiel oben (re: original frage example) haben Sie unter "DrawerLayout" ("LinearLayout") nur einen einzigen direkten untergeordneten Knoten und keine Schubladenansicht .

Bewegen Sie die Schubladenansicht aus Ihrem LinearLayout und platzieren Sie es danach.

6
WindSpirit

in meinem Fall, weil DrawerLayout attr: tools:openDrawer="start" habe ich Android:layout_gravity="start" für das zweite Element hinzugefügt

 <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

Verwenden Sie ein Layout von rechts nach links (RTL)? Das Festlegen der Schwerkraft im RTL-Layout würde diese Ausnahme auslösen. Dies kann behoben werden, indem der Start der Schwerkraft statt links eingestellt wird

1
user1474089

Sie sollten die gleiche Schwerkraft in DrawerLayout und NavigationView verwenden: Zum Beispiel: tools: openDrawer = "right" im DrawerLayout-Tag und Android: layout_gravity = "right" im NavigationView-Tag

<?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

Wenn Sie genauer hinsehen, werden Sie feststellen, dass es tatsächlich zwei Elemente der obersten Ebene gibt: LinearLayout und Fragment.

0
asiby

Java.lang.IllegalArgumentException: Keine Schubladenansicht mit Schwerkraft LINKS gefunden

L&OUML;SUNG Weisen Sie einer Ihrer untergeordneten DrawerLayout-Ansicht ein layout_gravity = "start" oder "left" - Attribut zu, wenn Ihr Schubladenlayout bereits über eine untergeordnete Ansicht verfügt. ODER Erstellen Sie einfach eine untergeordnete Ansicht in Ihrer DrawerLayout-Ansicht und geben Sie ein layout_gravity = "start" oder "left" attribute . zum Beispiel 

 <?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