【问题标题】:DrawerLayout Inside Fragment Provide Measure.EXACTLY Error片段内的 DrawerLayout 提供 Measure.EXACTLY 错误
【发布时间】:2017-11-04 06:00:06
【问题描述】:

根据这个相关问题Make drawerlayout inside fragment full screen height 我不确定是对还是错,但似乎片段总是不是全屏的,即它只是复制其内容的布局属性并使用它,这就是为什么你可以在一个布局中拥有两个或多个片段的原因。

现在我在将Drawerlayout 的高度设置为match_parent 时遇到问题,我得到的错误的完整堆栈粘贴在下面。我已经尝试了所有我知道的强制设置布局参数的方法,但它只是不起作用,如果我给布局一个特定的 dp,比如500dp,它就会起作用。

FATAL EXCEPTION: main
                                                                       Process: whalescorp.fabuloxity, PID: 16319
                                                                       java.lang.IllegalArgumentException: DrawerLayout must be measured with MeasureSpec.EXACTLY.
                                                                           at android.support.v4.widget.DrawerLayout.onMeasure(DrawerLayout.java:1041)
                                                                           at android.view.View.measure(View.java:19857)
                                                                           at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6083)
                                                                           at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
                                                                           at android.view.View.measure(View.java:19857)
                                                                           at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6083)
                                                                           at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1464)
                                                                           at android.widget.LinearLayout.measureVertical(LinearLayout.java:758)
                                                                           at android.widget.LinearLayout.onMeasure(LinearLayout.java:640)
                                                                           at android.view.View.measure(View.java:19857)
                                                                           at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6083)
                                                                           at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
                                                                           at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:139)
                                                                           at android.view.View.measure(View.java:19857)
                                                                           at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6083)
                                                                           at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1464)
                                                                           at android.widget.LinearLayout.measureVertical(LinearLayout.java:758)
                                                                           at android.widget.LinearLayout.onMeasure(LinearLayout.java:640)
                                                                           at android.view.View.measure(View.java:19857)
                                                                           at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6083)
                                                                           at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
                                                                           at android.view.View.measure(View.java:19857)
                                                                           at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6083)
                                                                           at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1464)
                                                                           at android.widget.LinearLayout.measureVertical(LinearLayout.java:758)
                                                                           at android.widget.LinearLayout.onMeasure(LinearLayout.java:640)
                                                                           at android.view.View.measure(View.java:19857)
                                                                           at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6083)
                                                                           at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
                                                                           at com.android.internal.policy.DecorView.onMeasure(DecorView.java:689)
                                                                           at android.view.View.measure(View.java:19857)
                                                                           at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2275)
                                                                           at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1366)
                                                                           at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1619)
                                                                           at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1254)
                                                                           at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6337)
                                                                           at android.view.Choreographer$CallbackRecord.run(Choreographer.java:874)
                                                                           at android.view.Choreographer.doCallbacks(Choreographer.java:686)
                                                                           at android.view.Choreographer.doFrame(Choreographer.java:621)
                                                                           at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:860)
                                                                           at android.os.Handler.handleCallback(Handler.java:751)
                                                                           at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                           at android.os.Looper.loop(Looper.java:154)
                                                                           at android.app.ActivityThread.main(ActivityThread.java:6119)
                                                                           at java.lang.reflect.Method.invoke(Native Method)
                                                                           at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
                                                                           at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

【问题讨论】:

    标签: android android-layout listview android-fragments


    【解决方案1】:

    这也可能由于新的 ConstraintLayout 而发生。确保抽屉布局不在 ConstraintLayout 的层次结构中。

    这对于 Android 来说是一个非常愚蠢的错误。我会尝试为它提交一个错误。

    【讨论】:

    • 没错!我做了什么,感谢您注意到这一点,并希望对其他人有所帮助。
    【解决方案2】:

    我决定通过扩展 DrawerLayout 本身来创建一个自定义 DrawerLayout,除了复制 DrawerLayout 中的方法之外什么也没做。但我唯一做的就是@Override DrawerLayout 中的 onMeasure 方法。

    下面是我的自定义 DrawerLayout 以及我在布局中如何调用它::

    public class WhalesDrawerLayout extends DrawerLayout {
    
        public WhalesDrawerLayout(Context context) {
            super(context);
        }
    
        public WhalesDrawerLayout(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public WhalesDrawerLayout(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
        }
    
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            widthMeasureSpec = MeasureSpec.makeMeasureSpec(
                    MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.EXACTLY);
            heightMeasureSpec = MeasureSpec.makeMeasureSpec(
                    MeasureSpec.getSize(heightMeasureSpec), MeasureSpec.EXACTLY);
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        }
    }
    

    在你的布局中应该这样调用:

    <whalescorp.projectname.packagename.WhalesDrawerLayout
        android:id="@+id/drawer"
        android:fitsSystemWindows="true"
        tools:openDrawer="start"
        android:layout_height="match_parent"
        android:layout_width="match_parent">
    
    </whalescorp.projectname.packagename.WhalesDrawerLayout>
    

    通过在你的activity.xml中输入类名,它会带来建议,你也可以很容易地得到它,同时你需要在它工作之前重建你的项目,你可以在你的代码中调用它这::

    final WhalesDrawerLayout drawerLayout = l.findViewById(R.id.drawer); 
    

    【讨论】:

    • 这是一个非常好的实现,任何想使用ConstraintLayout的人都应该尝试一下。
    • 顺便说一句,你得到了很好的答案!
    猜你喜欢
    • 2020-11-23
    • 1970-01-01
    • 2015-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-06
    相关资源
    最近更新 更多