我需要为 Activity 的纵向和横向应用不同的布局。此外,如果方向是纵向,我需要显示警报。

我在AndroidManifest中指定了android:configChanges="orientation|keyboardHidden"。我也像这样重写onConfigurationChanged方法:

@Override
public void onConfigurationChanged(Configuration newConfig)
{
    Log.d("tag", "config changed");
    super.onConfigurationChanged(newConfig);

    int orientation = newConfig.orientation;
    if (orientation == Configuration.ORIENTATION_PORTRAIT)
        Log.d("tag", "Portrait");
    else if (orientation == Configuration.ORIENTATION_LANDSCAPE)
        Log.d("tag", "Landscape");
    else
        Log.w("tag", "other: " + orientation);

    ....
}

从横向旋转到纵向时,日志看起来像:
config changed
Portrait

但是,当从纵向更改为横向时,它看起来像
config changed
Portrait
config changed
Landscape

为什么onConfigurationChanged被调用两次?我该如何避免呢?

最佳答案

在这里查看我对另一个问题的回答:https://stackoverflow.com/a/3252547/338479

简而言之,很难正确处理配置更改。最好实现onRetainNonConfigurationInstance(),它会在您的应用程序由于配置更改而即将停止和重新启动之前被调用。使用此方法可以保存您想要的任何内容(“这是一个不错的选择”),然后让系统关闭您的应用程序。

当您的应用使用新配置重新启动时,请使用getLastNonConfigurationInstance()检索刚刚保存的状态,并使用它来继续您的应用,而不会因为 bundle 和共享首选项而烦恼了所有事情。

10-07 19:23
查看更多