处理在Android中旋转的活动

dar*_*rja 5 android orientation onconfigurationchanged android-activity

我需要为我的活动的纵向和横向方向应用不同的布局.此外,如果方向是肖像,我需要显示警报.

android:configChanges="orientation|keyboardHidden"在AndroidManifest中指定了.我也像这样重写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);

    ....
}
Run Code Online (Sandbox Code Playgroud)

从横向旋转到纵向日志时看起来像:

config changed
Portrait
Run Code Online (Sandbox Code Playgroud)

但是,当从纵向变为风景时,它看起来像

config changed
Portrait
config changed
Landscape
Run Code Online (Sandbox Code Playgroud)

为什么onConfigurationChanged被调用两次?我怎么能避免呢?

Edw*_*alk 3

请参阅我对另一个问题的回答:/sf/answers/227678321/

简而言之,正确处理配置更改是很难做到的。最好实现onRetainNonConfigurationInstance(),该方法在应用程序因配置更改而即将停止并重新启动之前调用。使用此方法保存您想要的任何内容(“这是一个不错的选择”),然后让系统拆除您的应用程序。

当您的应用程序使用新配置重新启动时,使用getLastNonConfigurationInstance()检索您刚刚保存的状态,并使用它来继续您的应用程序,而无需使用捆绑包和共享首选项。