【问题标题】:ClassCastException ViewGroup$LayoutParams cannot be cast to ViewPager$LayoutParamsClassCastException ViewGroup$LayoutParams 无法转换为 ViewPager$LayoutParams
【发布时间】:2013-09-02 17:56:57
【问题描述】:

我的初始代码行在被覆盖的方法onGlobalLayout()内:

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

在被覆盖的方法onGlobalLayout()-中发生ClassCastException-

错误日志:

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>

【问题讨论】:

  • developer.android.com/reference/android/support/v4/view/…。检查构造函数。 public ViewPager.LayoutParams (Context context, AttributeSet attrs) 你的参数是错误的,没有构造函数将 int int 作为参数
  • 请检查您的进口情况
  • 好的,我确实检查过了,但是如何解决它。
  • @LiaPronina - android.support.v4.view.ViewPager
  • 这是什么img?这在 XML 中在哪里,img 的父级是什么@

标签: android classcastexception


【解决方案1】:

您的图片已经有布局参数。您可以像这样修改现有布局参数,而不是用新对象替换它们(在这种情况下是错误的类型,ViewPager 期望它们是 ViewPager.LayoutParams):

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

请注意,在onGlobalLayout() 中无条件地请求重新布局可能是个坏主意,会导致无限次布局传递。是不是这样,我自己也没有验证过。

【讨论】:

  • 这会导致循环。我试图在onGlobalLayout() 之后对我的代码提出质疑,并且它工作正常,但我注意到我的代码在onGlobalLayout() 之前被调用。这看起来很奇怪,就像线程一样。所以我一定要把它放在onGlobalLayout()里面。
  • 是的——你能解释一下为什么你需要在全局布局监听器中修改布局吗?可能有更好的方法。 (这个答案解决了类转换异常问题。)
  • 因为我试图获取文本视图和图像视图的结束位置。请参阅我的这篇 SO 帖子和我自己接受的答案-http://stackoverflow.com/questions/18533224/getting-end-position-of-the-textview-and-imageview-with-respect-to-top-of-the-sc
  • 见我刚刚修改了自己的答案,将 img 代码包含在其中。
  • 谢谢,我可以停止循环,view.getViewTreeObserver().removeOnGlobalLayoutListener(this);
【解决方案2】:

这样做

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

更新

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

【讨论】:

  • 我也已经检查过了。它给出了相同的异常,但这次使用以下日志:09-02 14:37:23.953: E/AndroidRuntime(5822): java.lang.ClassCastException: android.view.ViewGroup$LayoutParams cannot be cast to android.support.v4.view.ViewPager$LayoutParams
  • 这工作正常但会导致循环。我试图在 onGlobalLayout() 之后对我的代码提出质疑并且它工作正常,但我注意到我的代码在 onGlobalLayout() 之前被调用。这看起来很奇怪,就像线程一样。所以我一定要把它放在onGlobalLayout()里面。
【解决方案3】:

您应该确保您使用的 LayoutParam 类来自正确的父 Layout 类。并且您需要设置 ViewGroup 的 LayoutParams ViewPager 所在的 View 的父级需要知道分配给子视图的大小。 例如,在您的情况下,ViewGroupRelativeLayout,您需要使用 RelativeLayout.LayoutParams 类。

您可以尝试以下操作:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多