0

まず、私がやろうとしていることについての背景を説明します。プログラムで(実行時に)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ソースにデバッグすることですが、必要な正確なバージョンを取得することは困難であり、デバッグするのに時間的に非常にコストがかかります。

だから問題は、私がやろうとしていることに明らかに何か問題があるので、愚かな使用法エラーのデバッグに何時間も費やさないということです。

PS:私がテストしている/ターゲティングしているAndroidのバージョンは1.6(エミュレーター)です。

4

1 に答える 1

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));
于 2012-08-14T14:50:26.543 に答える