问题
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));
来源:https://stackoverflow.com/questions/18569267/classcastexception-viewgrouplayoutparams-cannot-be-cast-to-viewpagerlayoutpara