处理在Android中旋转的活动

时间:2010-09-25 14:50:43

标签: android android-activity orientation onconfigurationchanged

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

我在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被调用两次?我怎么能避免它?

5 个答案:

答案 0 :(得分:3)

请在此处查看我对其他问题的回答:https://stackoverflow.com/a/3252547/338479

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

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

答案 1 :(得分:1)

您只需保存上一个方向并检查它是否真的发生了变化。

如果您为AndroidManifest.xml android:configChanges设置keyboardHidden|orientation活动,onCreate等等,则无法呼叫。这使得实现更加容易实现。但当然布局也会从纵向变为景观。

答案 2 :(得分:0)

您选择以这种方式处理轮换有什么特别的原因吗?虽然它更快,因为活动不会在方向更改时重新启动,但如果我没记错的话,通常不建议这样做。另一种处理方向更改的方法是覆盖onConfigurationChanged(),而不是覆盖onCreate()onStart()onResume(),以便

@Override
public void onStart() {
    super.onStart();
    int orientation = getWindowManager().getDefaultDisplay().getOrientation();
    if(orientation == Configuration.ORIENTATION_PORTRAIT) {
        Log.i(TAG, "Orientation is portrait");
        // show whatever alerts here
    }
}

然后指定两个布局 - 一个用于纵向,一个用于横向。布局的纵向版本将保留为res/layout/whatever.xml,横向版本将保留在res/layout-land/whatever.xml中。 AndroidGuys写了很多关于这个主题的好文章,请参阅http://androidguys.com/?s=rotational+forces&x=9&y=9

答案 3 :(得分:0)

我很确定你会想要使用onCreate而不是onStart。唯一的区别似乎是当应用程序到达前台时将调用onStart。这不是您希望让用户等待您重新初始化UI的情况。否则,只需根据if条件更改setContentView调用。

答案 4 :(得分:0)

Android在更改方向时会启动活动的新实例,因此使用onCreate是理想的方法。您必须明确保存/恢复活动的数据,以便从中断的地方继续 - 但无论如何您应该这样做,因为任何数量的事件都可能会使您的应用程序失去焦点/终止。