Android DrawerLayout - 没有重力抽屉视图

Tob*_*ias 31 android navigation-drawer

当我点击我的抽屉切换时,我得到以下异常

java.lang.IllegalArgumentException:在重力下没有找到抽屉视图

这是我的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>
Run Code Online (Sandbox Code Playgroud)

我的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>
Run Code Online (Sandbox Code Playgroud)

还有我的清单项目

<?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>
Run Code Online (Sandbox Code Playgroud)

Dmy*_*tro 24

从文档

要使用DrawerLayout,请将主要内容视图定位为宽度和高度为match_parent的第一个子视图.在主内容视图后添加抽屉作为子视图,并相应地设置layout_gravity.抽屉通常使用match_parent作为具有固定宽度的高度.

<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>
Run Code Online (Sandbox Code Playgroud)


Dev*_*aja 16


好.让我在这里简单明了.
什么是DrawerLayouthttps://developer.android.com/reference/android/support/v4/widget/DrawerLayout.html

DrawerLayout 充当窗口内容的顶级容器,允许从窗口边缘拉出交互式"抽屉"视图.使用android:layout_gravity 子视图上的属性控制抽屉定位和布局,子视图对应于您希望抽屉出现的视图的哪一侧:左侧或右侧.(或者在支持布局方向的平台版本上开始/结束.)要使用a DrawerLayout,请将主要内容视图定位为宽度和高度为的第一个子视图match_parent.在主内容视图后添加抽屉作为子视图并进行layout_gravity适当设置 .抽屉通常match_parent用于具有固定宽度的高度.


是什么DrawerLayout?,简单来说:
  • Android支持的布局允许您在主屏幕上显示覆盖屏幕(称为抽屉).
  • DrawerLayout需要使用子视图,类似于LinearLayout和RelativeLayout.
  • 子视图必须具有属性集
    android:layout_gravity="start"ORandroid:layout_gravity="left"
  • DrawerLayout使用此childView来了解从哪里开始显示抽屉,即从左到右或从右到左.有些国家/地区的文本从右到左阅读.


Techie Stuff:
  • EVENT#1:ActionBarDrawerToggle.java被设置为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);
        
  • EVENT#2:用户点击调用ActionBarDrawerToggle.javatoggle()函数 的Toolbar.navigationIcon (android-sdk\sources\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); 
            } 
        } 
        

    Gravity.java (android-sdk\sources\android-22\android\view\Gravity.java)
    /** Push object to x-axis position at the start of its container,
        not changing its size.*/ 
        public static final int START = RELATIVE_LAYOUT_DIRECTION | Gravity.LEFT; 
        
  • EVENT#3:Toggle()函数调用mDrawerLayout.openDrawer(Gravity.START)
    DrawerLayout.java(support-v4-22.1.1.jar库)
        /*** Open the specified drawer by animating it out of view. **
        @param gravity Gravity.LEFT to move the left drawer or Gravity.RIGHT
        for the right. * GravityCompat.START or GravityCompat.END may also
        be used. */ 
        public void openDrawer(@EdgeGravity int gravity) { 
            final View drawerView = findDrawerWithGravity(gravity); 
            if (drawerView == null) { 
                throw new IllegalArgumentException("No drawer view found with gravity " +
        gravityToString(gravity)); 
            }
            openDrawer(drawerView); 
        }
        
  • 事件#4:如果没有设置DrawerLayout的childView ,则抛出layout_gravity="start”或抛出. leftNo drawer view found with gravity LEFT

解:

    <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…
Run Code Online (Sandbox Code Playgroud)


小智 7

"Android Drawer"需要是"DrawerLayout"的直接子节点.

在上面的例子中(re:原始问题示例),在"DrawerLayout"("LinearLayout")下只有一个直接子节点,后面没有抽屉视图.

将抽屉视图移出LinearLayout并将其放在其后面.