【问题标题】:Handling activity rotating in Android处理 Android 中的活动轮换
【发布时间】:2010-09-25 14:50:43
【问题描述】:

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

我在 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 会被调用两次?如何避免?

【问题讨论】:

    标签: android android-activity orientation onconfigurationchanged


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      您可以简单地保存以前的方向并检查它是否真的改变了。

      如果您将AndroidManifest.xml android:configChanges 设置为keyboardHidden|orientation 为您的活动,onCreate 等...将不会被调用。这使得实现更容易实现。当然,布局也会从纵向变为横向。

      【讨论】:

        【解决方案3】:

        您选择以这种方式处理旋转有什么特别的原因吗?虽然它更快,因为活动不会在方向更改时重新启动,但如果我没记错的话,通常不建议这样做。处理方向变化的另一种方法是代替覆盖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

        【讨论】:

        • 为什么 onConfigurationChanged() 是不好的方法?你能给我一个解释的链接吗?如果我将使用 onCreate() 或类似的东西,该活动将被重新创建并且其数据将丢失。
        【解决方案4】:

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

        【讨论】:

        • 我同意你的观点,当设备的方向改变时会调用onCreate方法
        • 为什么比 onConfigurationChanged 更好?
        • 我相信在这种情况下你最终会构建你的 UI 两次。当屏幕旋转时,onConfigurationChange 和 onCreate 都会被调用。您已经必须在 onCreate 中为所有其他创建情况设置 UI。
        • 我注意到,如果处理了 onConfigurationChanged,则不会重新创建活动,不会调用 onDestroy 和 onCreate
        【解决方案5】:

        Android 在改变方向时会启动一个新的 Activity 实例,因此使用 onCreate 是理想的方法。显然,您必须保存/恢复您的活动数据才能从上次中断的地方继续 - 但无论如何您都应该这样做,因为任何数量的事件都可能使您的应用程序失去焦点/杀死您的应用程序。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-11-04
          • 2011-12-28
          • 1970-01-01
          • 1970-01-01
          • 2019-04-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多