首先,介紹一下我正在嘗試做的事情。我以編程方式(在運行時)刪除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(模擬器)。
啊確定。我想這是對LayoutParams如何工作的根本性誤解。我猜想怪異的語法存在是因爲你在父級上設置屬性(否則它只是parentContainer.setWidth和parentContainer.setHeight,而不是傳入特殊的數據持有者)。我可能會選擇像parentContainer.getParent()。setChildWidth(parentContainer,...)這樣的接口,而不是'傳入一個對象,它會崩潰,如果它是錯誤的',但我猜Android的人有有理由這樣做。 測試您的解決方案,它的工作原理。謝啦。 – Alex 2012-08-14 15:03:43