为什么使用DrawerLayout会产生IllegalArgumentException:必须使用MeasureSpec.EXACTLY测量DrawerLayout

时间:2017-08-09 00:09:54

标签: android kotlin drawerlayout

以下是我的xml:

<?xml version="1.0" encoding="utf-8"?>
<layout>

<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/root_drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="tailamade.boop.CustomerHomeActivity"
    tools:openDrawer="start">

    <include
        layout="@layout/content_customer_home"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <android.support.design.widget.NavigationView
        android:id="@+id/navigationView"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        app:headerLayout="@layout/activity_main"
        app:menu="@menu/menu_customer_home" />

</android.support.v4.widget.DrawerLayout>

</layout>

我也尝试过编写自己的CustomDrawerLayout(没有运气):

class CustomDrawerLayout : DrawerLayout {

constructor(context: Context) : super(context)

constructor(context: Context, attrs: AttributeSet) : super(context, attrs)

constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(context, attrs, defStyle)

override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
    var widthMeasureSpec = widthMeasureSpec
    var heightMeasureSpec = heightMeasureSpec
    widthMeasureSpec = MeasureSpec.makeMeasureSpec(
            MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.EXACTLY)
    heightMeasureSpec = MeasureSpec.makeMeasureSpec(
            MeasureSpec.getSize(heightMeasureSpec), MeasureSpec.EXACTLY)
    super.onMeasure(widthMeasureSpec, heightMeasureSpec)
}

}

我见过有关此例外的其他帖子,但“解决方案”不起作用。这是什么问题?

1 个答案:

答案 0 :(得分:0)

宽度需要在dpi中指定,而不是“wrap_content”(参见navigation drawer documentation

  

•抽屉视图以dp为单位指定其宽度,高度与父视图匹配。抽屉宽度不应超过320dp,因此用户始终可以看到主要内容的一部分

编辑就您的子课而言,是否会出现同样的错误?我猜测当计算“wrap_content”大小时,实际宽度无效(可能为零)。您应该检查onMeasure中的宽度并确保它在限制范围内(大于零,大大小于父宽度,以便在抽屉打开时仍可以看到它。)