【问题标题】:Why does getLayoutParams() throw exception when called inside some events? e.g., onSaveInstanceState为什么在某些事件中调用 getLayoutParams() 会抛出异常?例如,onSaveInstanceState
【发布时间】:2015-09-05 21:17:59
【问题描述】:

我有一个带有一个 View 对象(一个简单的位图)的 RelativeLayout。为了兼容性,我使用 getLayoutParams() 和 setLayoutParams() 来移动它。

但是当从 onSaveInstanceState() 事件内部调用 getLayoutParams() 时(例如,因为屏幕旋转),程序中止并显示消息“应用程序...已意外停止。请重试”。代码:

@Override
    protected void onSaveInstanceState(Bundle outState) {
        View v=findViewById(R.id.MyView);
        RelativeLayout.LayoutParams lp;
        lp=(RelativeLayout.LayoutParams)v.getLayoutParams();  // **Exception!!!**

        // ... (do something with lp.leftMargin, etc)

        super.onSaveInstanceState(outState);
    }

这些是相关的异常第一行:

Caused by: java.lang.ClassCastException: android.widget.FrameLayout$LayoutParams
        at com.example.Main.onSaveInstanceState(Main.java:85)
        at android.app.Activity.performSaveInstanceState(Activity.java:1037)
        at android.app.Instrumentation.callActivityOnSaveInstanceState(Instrumentation.java:1181)
        at android.app.ActivityThread.performPauseActivity(ActivityThread.java:2336)

在 onCreate() 和 onPause() 事件中也会发生同样的情况。

当我在其他函数(例如计时器事件函数)中使用 getLayoutParams() 时,它可以正常工作。

【问题讨论】:

  • 可以分享一下xml文件吗?

标签: java android android-layout exception android-event


【解决方案1】:

getLayoutParams 方法返回一个ViewGroup.LayoutParams。这个有很多很多的子类,包括RelativeLayout.LayoutParams。您的 View v 必须返回错误的类型。

如果您需要使用leftMargin 等,您应该尝试将RelativeLayout.LayoutParams 替换为ViewGroup.MarginLayoutParams。我不确定它是否会起作用,因为我不知道 v 的类别。

【讨论】:

  • 精准诊断!错误地,我试图从(Layout).getLayoutParams() 函数中获取RelativeLayout.LayoutParams 类,而不是从(ImgView).getLayoutParams。所以这是一个简单的类型转换错误......我想我没有完全阅读异常的第一行:Caused by: java.lang.ClassCastException
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-28
  • 2013-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多