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

时间:2015-09-05 21:18:00

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

我有一个具有一个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()时,它可以正常工作。

1 个答案:

答案 0 :(得分:1)

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

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