2012-08-14 56 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