【问题标题】:Android LinearLayout.LayoutParams throwing exception on View.measure()Android LinearLayout.LayoutParams 在 View.measure() 上抛出异常
【发布时间】:2012-08-14 22:50:26
【问题描述】:

首先,关于我正在尝试做的事情的一些背景知识。我以编程方式(在运行时)删除 ScrollView 的子元素并将其替换为 LinearLayout,并将曾经是 ScrollView 的子元素添加为 LinearLayout 的子元素。但是,为了获得我想要实现的目标,我必须处理我创建的 LinearLayout 的设置。至少,我意识到我必须设置 LinearLayout 的方向并更改一些大小设置。不幸的是,当我使用 LinearLayout 的 setLayoutParams() 方法时,它最终导致我的应用程序在某个地方崩溃(此代码从 onCreate 运行,但堆栈跟踪不显示 onCreate)。以下是相关代码:

parentContainer = new LinearLayout(activity);

            // So now we swap out our LinearLayout as the ScrollView's child and parent the ViewGroup to the LinearLayout.
            scrollView.removeAllViews();
            scrollView.addView(parentContainer);
            parentContainer.setOrientation(LinearLayout.VERTICAL);
            parentContainer.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));

显然(最佳猜测)导致问题的行是:

parentContainer.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));

堆栈跟踪显示:

java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams
    at android.widget.ScrollView.onMeasure(ScrollView.java:291)
    at android.view.View.measure(View.java:7703)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:2989)
    at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:888)
    at android.widget.LinearLayout.measureVertical(LinearLayout.java:350)
    at android.widget.LinearLayout.onMeasure(LinearLayout.java:278)
    at android.view.View.measure(View.java:7703)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:2989)
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)
    at android.view.View.measure(View.java:7703)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:2989)
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)
    at android.view.View.measure(View.java:7703)
    at android.view.ViewRoot.performTraversals(ViewRoot.java:747)
    at android.view.ViewRoot.handleMessage(ViewRoot.java:1613)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:123)
    at android.app.ActivityThread.main(ActivityThread.java:4203)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:521)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549)
    at dalvik.system.NativeStart.main(Native Method)

这让我认为我错误地使用了 LayoutParams,但是 LinearLayout.LayoutParams 和 setLayoutParams 的文档没有提供任何线索,并且异常没有相关消息(这在 Android 端是非常糟糕的设计) .我想检查是否有其他人知道我在这里做错了什么。我的下一步是调试到 Android 源代码,但很难获得我需要的确切版本,而且调试它的时间成本非常高。

所以问题是,我正在尝试做的事情有什么明显的错误,这样我就不用花几个小时调试一些愚蠢的使用错误了吗?

P.S.:我正在测试/定位的 Android 版本是 1.6(模拟器)。

【问题讨论】:

    标签: android android-layout android-linearlayout


    【解决方案1】:

    您没有将 LinearLayout 放置在另一个 LinearLayout 中,因此您会遇到类转换异常。由于您将其放置在扩展 FrameLayout 的 ScrollView 中,因此将该行更改为:

    parentContainer.setLayoutParams(new FrameLayout.LayoutParams(FrameLayout.LayoutParams.FILL_PARENT, FrameLayout.LayoutParams.WRAP_CONTENT));
    

    或者,您可以在将布局参数添加到视图时设置布局参数,如下所示:

    scrollView.addView(parentContainer, new FrameLayout.LayoutParams(FrameLayout.LayoutParams.FILL_PARENT, FrameLayout.LayoutParams.WRAP_CONTENT));
    

    【讨论】:

    • 嗯,好的。我想这是对 LayoutParams 如何工作的根本误解。我猜之所以存在怪异的语法是因为您要在父对象上设置属性(否则它将只是 parentContainer.setWidth 和 parentContainer.setHeight 而不是传入特殊的数据持有者)。我可能会选择像 parentContainer.getParent().setChildWidth(parentContainer, ...) 这样的接口,而不是“传入一个对象,如果它是错误的,它会崩溃”,但我猜 Android 人有这样做的一些理由。测试了您的解决方案并且它有效。谢谢大佬。
    猜你喜欢
    • 2012-01-31
    • 1970-01-01
    • 1970-01-01
    • 2016-02-28
    • 2012-09-30
    • 2019-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多