ClassCastException ViewGroup$LayoutParams cannot b

2020-08-10 23:44发布

问题:

My initial code line is inside the overridden method onGlobalLayout():

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

ClassCastException occuring in the overridden method onGlobalLayout()-

Error Log:

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)

And when I do the following in order to resolve the above error as indicated in other SO posts:

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

Then, I get the compile time error:

The constructor ViewPager.LayoutParams(int, int) is undefined

ViewPager in xml is defined like:

<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>

回答1:

Your image already has layout params. Instead of replacing them with a new object (which is of wrong type in this case, ViewPager expects them to be ViewPager.LayoutParams), you can modify existing layout params like this:

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

Note that unconditionally requesting re-layout in onGlobalLayout() can be a bad idea, leading to infinite layout passes. I haven't verified it myself whether this is the case.



回答2:

Do this way

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);


回答3:

You should make sure the LayoutParam class you are using is from the correct parent Layout class. And you need to set the LayoutParams of the ViewGroup the ViewPager is sitting in, as the parent of the View that needs to know what size to allocate to the child View. For example, in your case the ViewGroup is a RelativeLayout, you need to use the RelativeLayout.LayoutParams class.

You can try following:

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