为什么在某些事件中调用 getLayoutParams() 会抛出异常?例如,onSaveInstanceState

Why does getLayoutParams() throw exception when called inside some events? e.g., onSaveInstanceState

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

但是当从 onSaveInstanceState() 事件内部调用 getLayoutParams() 时(例如,因为屏幕旋转),程序中止并显示消息 "The application ... has stopped unexpectedly. Please try again"。代码:

@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() 时,它工作正常。

方法getLayoutParamsreturns一个ViewGroup.LayoutParams。这个有很多很多子classes,包括RelativeLayout.LayoutParams。您的 View v 一定返回了错误的类型。

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