ImageViewのLayoutParamsって…

Androidのお話で。


いやー、まいったねー。

ImageView iv = (ImageView) findViewById(R.id.image_a);
LayoutParams lp = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
iv.setLayoutParams(lp);


って書いたら、こんなエラーが出やがんの。

07-18 14:30:47.876: ERROR/AndroidRuntime(1504): Uncaught handler: thread main exiting due to uncaught exception
07-18 14:30:47.886: ERROR/AndroidRuntime(1504): java.lang.ClassCastException: android.view.ViewGroup$LayoutParams
07-18 14:30:47.886: ERROR/AndroidRuntime(1504): at android.widget.LinearLayout.measureHorizontal(LinearLayout.java:585)
07-18 14:30:47.886: ERROR/AndroidRuntime(1504): at android.widget.LinearLayout.onMeasure(LinearLayout.java:280)
07-18 14:30:47.886: ERROR/AndroidRuntime(1504): at android.view.View.measure(View.java:7964)
07-18 14:30:47.886: ERROR/AndroidRuntime(1504): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3023)
07-18 14:30:47.886: ERROR/AndroidRuntime(1504): at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:888)


で、これは何が原因かっていうと。

ImageView iv = (ImageView) findViewById(R.id.image_a);
ここ→LayoutParams lp = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
iv.setLayoutParams(lp);


これは

LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);


とするべきところなんだねー。クラスが違うからClassCastExceptionになっているんだねー。APIにも"setLayoutParams()"は、Viewクラスから継承したメソッドで、引数はViewGroup.LayoutParamsって書いてあるけど、実際は違っているようですねー。きっとLayoutParamsのインスタンスから何か値を取得するクラス毎に用意する必要がありそうですね。


別にいいじゃんねー。同じ"LayoutParams"なんだし…。なんでわざわざ別々に…。