2012-08-14 80 views
0

首先,介绍一下我正在尝试做的事情。我以编程方式(在运行时)删除ScrollView的子元素并将其替换为LinearLayout,并将之前作为ScrollView的子元素添加为LinearLayout的子元素。但是,为了获得我想要实现的目标,我必须处理设置我创建的LinearLayout。至少,我意识到我必须设置LinearLayout的方向并更改一些尺寸设置。不幸的是,当我使用LinearLayout的setLayoutParams()方法时,它最终会崩溃我的应用程序(此代码从onCreate运行,但堆栈跟踪不显示onCreate)。下面是相关代码:Android LinearLayout.LayoutParams在View.measure上抛出异常()

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(模拟器)。

回答

0

您并未将LinearLayout放置在另一个LinearLayout中,因此您将得到类转换异常。既然你把它延伸的FrameLayout更改行这样的滚动型中:

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

Alternativly可以设置布局参数,当你将它添加到这样的观点:

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

啊确定。我想这是对LayoutParams如何工作的根本性误解。我猜想怪异的语法存在是因为你在父级上设置属性(否则它只是parentContainer.setWidth和parentContainer.setHeight,而不是传入特殊的数据持有者)。我可能会选择像parentContainer.getParent()。setChildWidth(parentContainer,...)这样的接口,而不是'传入一个对象,它会崩溃,如果它是错误的',但我猜Android的人有有理由这样做。 测试您的解决方案,它的工作原理。谢啦。 – Alex 2012-08-14 15:03:43