Android LinearLayout.LayoutParams在View.measure()上抛出异常

时间:2012-08-14 14:46:02

标签: android android-layout android-linearlayout

首先,关于我正在尝试做什么的一些背景知识。我以编程方式(在运行时)删除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(模拟器)。

1 个答案:

答案 0 :(得分:0)

您没有将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));
相关问题