web-dev-qa-db-ja.com

ClassCastException ViewGroup $ LayoutParamsをViewPager $ LayoutParamsにキャストできません

私の最初のコード行は、オーバーライドされたメソッドonGlobalLayout()の中にあります。

_img.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, 100));
_

オーバーライドされたメソッドで発生するClassCastExceptiononGlobalLayout()-

エラーログ:

_09-02 14:25:35.326: E/AndroidRuntime(5187): Java.lang.ClassCastException: Android.view.ViewGroup$LayoutParams cannot be cast to Android.support.v4.view.ViewPager$LayoutParams
09-02 14:25:35.326: E/AndroidRuntime(5187):     at Android.support.v4.view.ViewPager.onMeasure(ViewPager.Java:1319)
09-02 14:25:35.326: E/AndroidRuntime(5187):     at Android.view.View.measure(View.Java:15181)
09-02 14:25:35.326: E/AndroidRuntime(5187):     at Android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.Java:617)
09-02 14:25:35.326: E/AndroidRuntime(5187):     at Android.widget.RelativeLayout.onMeasure(RelativeLayout.Java:399)
09-02 14:25:35.326: E/AndroidRuntime(5187):     at Android.view.View.measure(View.Java:15181)
09-02 14:25:35.326: E/AndroidRuntime(5187):     at Android.view.ViewGroup.measureChildWithMargins(ViewGroup.Java:4814)
09-02 14:25:35.326: E/AndroidRuntime(5187):     at Android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.Java:1390)
_

そして、他のSOの投稿に示されているように、上記のエラーを解決するために次のことを行うと:

_img.setLayoutParams(new ViewPager.LayoutParams(ViewPager.LayoutParams.MATCH_PARENT, 100));
_

次に、コンパイル時エラーが発生します。

_The constructor ViewPager.LayoutParams(int, int) is undefined
_

XmlのViewPagerは次のように定義されます。

_<Android.support.v4.view.ViewPager
 Android:id="@+id/HView"
 Android:layout_width="560dp"
 Android:layout_height="255dp"
 Android:layout_centerHorizontal="true"
 Android:layout_marginLeft="160sp"
 Android:layout_marginTop="110sp"
 Android:layout_marginBottom="80sp">
 </Android.support.v4.view.ViewPager>
_
14
My God

画像にはすでにレイアウトパラメータがあります。それらを新しいオブジェクト(この場合は間違ったタイプであり、ViewPagerは_ViewPager.LayoutParams_であると想定します)に置き換える代わりに、次のように既存のレイアウトパラメーターを変更できます。

_ViewGroup.LayoutParams params = img.getLayoutParams();
params.width = ViewGroup.LayoutParams.MATCH_PARENT;
params.height = 100;
img.requestLayout();
_

onGlobalLayout()で無条件に再レイアウトを要求することは悪い考えであり、無限のレイアウトパスにつながる可能性があることに注意してください。私はこれが事実であるかどうかを自分で確認していません。

24
laalto

使用しているLayoutParamクラスが正しい親Layoutクラスのものであることを確認する必要があります。そして、子ビューに割り当てるサイズを知る必要があるViewGroupの親として、ViewPagerが置かれているViewのLayoutParamsを設定する必要があります。たとえば、ViewGroupRelativeLayoutの場合、RelativeLayout.LayoutParamsクラスを使用する必要があります。

次のことを試すことができます。

img.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, 100));
0
Ritesh Gune

このようにします

img.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 100));

[〜#〜] update [〜#〜]

 LayoutParams params = img.getLayoutParams();
         params.width = LayoutParams.MATCH_PARENT;
         params.height = 100;
         img.setLayoutParams(params);
0
Biraj Zalavadia