【问题标题】:Android configuration changed安卓配置改变了
【发布时间】:2012-01-13 01:21:48
【问题描述】:

我很想知道在旋转 Android 设备时(即配置更改时)哪些方法会被覆盖?

onSaveInstanceState(...), onConfigurationChanged(...), onRestoreInstanceState(...) - 类似的东西?

听听与更改配置相关的整个过程对我来说也很有趣。谢谢。

【问题讨论】:

    标签: android configuration rotation


    【解决方案1】:

    根据你必须使用的android开发者参考:

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
    
        // Checks the orientation of the screen
        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
            Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
        } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
            Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
        }
    }
    

    欲了解更多信息,请参阅:http://developer.android.com/guide/topics/resources/runtime-changes.html#HandlingTheChange

    您可能有兴趣查看:http://developer.android.com/guide/topics/manifest/activity-element.html#config

    在这里你可以找到所有你可以监听的配置监听器。

    记得把它们放在 android manifest 中:

    <activity 
       android:configChanges=["orientation"]
       . . .
    </activity>
    

    希望这会有所帮助...

    【讨论】:

    • 感谢“处理运行时更改”链接。我目前正在使用 onConfigurationChanged。
    • 这个答案对我有帮助..但是关于使用某种形式的android:configChanges 更新清单的部分..我错过了,因为它靠近底部并且我的屏幕尺寸适中。没什么大不了的..但将它放在Java代码附近可能会有所帮助..我在该方法中设置了断点,但直到我意识到我需要清单更新时它们才被触发。任何方式..感谢您让我朝着正确的方向前进!
    【解决方案2】:

    当您旋转设备时,您的 Activity 将重新创建,并且所有变量都将重新初始化。因此,在这种情况下,如果您希望某些值在 Rotation 上保持不变,您也可以使用 onSaveInstanceState() 存储它们的状态,并且您可以通过检查 Bundle is not null 再次在 onCreate() 中恢复。

    if(savedInstanceState != null){
                // get the restore value from the Bundle
            }
    

    当您旋转设备时,onConfigurationChanged() 将被调用(请注意,只有在您选择了您想在清单中使用 configChanges 属性处理的配置时才会调用它 )。从参数中您将获得新的设备配置。

    如果您不希望在设备旋转时重新创建 Activity,则必须将此行添加到 AndroidManifest 文件中的 Activity 标记中。

    android:ConfigChanges="keyboardHidden|orientation"
    

    【讨论】:

    • 我对此有疑问。我有两种布局:一种用于横向,一种用于纵向。我有一个文本视图。而且我不想丢失旋转时输入的文本。到现在我使用了onConfigurationChanged,基本上和onCreate中的工作人员一样。问题是在 onConfigurationChanged 中我没有 Bundle 并且无法保存/检索键入的文本。当我使用 onSaveInstanceState() 和 onConfigurationChanged() 时,第一个没有任何效果。我不知道如何解决这个问题......
    • 您在 onCreate() 中检索 Bundle 值并进一步使用它。
    • 我理解我的错误,我不必使用 configChanges。我只需要覆盖 onSaveInstanceState 和 onRestoreInstanceState。在那里我可以保存/检索我的文本视图,布局配置处理是自动完成的,所以我不需要做任何其他事情。 onConfigurationChanged 覆盖了一切,我不需要这么复杂的逻辑。
    • 请注意保存内容/方式。开发人员文档中的一句话:“你永远不应该传递一个绑定到 Activity 的对象,例如 Drawable、Adapter、View 或任何其他与 Context 关联的对象。如果你这样做了,它会泄漏所有原始活动实例的视图和资源。(资源泄漏意味着您的应用程序会保留它们,并且它们不能被垃圾收集,因此可能会丢失大量内存。)“有关更多信息,请参阅developer.android.com/guide/topics/resources/…
    【解决方案3】:

    来自安卓开发者...

    在运行时配置更改期间保留对象:

    1. 重写onRetainNonConfigurationInstance() 方法以返回您想要保留的对象。
    2. 当您的 Activity 再次创建时,调用 getLastNonConfigurationInstance() 以恢复您的 Object。

    Android 由于配置更改而关闭您的 Activity 时,会在 onStop() 和 onDestroy() 之间调用 onRetainNonConfigurationInstance()。在 onRetainNonConfigurationInstance() 的实现中,您可以返回所需的任何对象,以便在配置更改后有效地恢复您的状态。

    如果您的应用程序从 Web 加载大量数据,这可能会很有价值。如果用户更改了设备的方向并且 Activity 重新启动,您的应用程序必须重新获取数据,这可能会很慢。你可以做的是实现onRetainNonConfigurationInstance() 来返回一个携带你的数据的对象,然后当你的Activity 再次以getLastNonConfigurationInstance() 启动时检索数据。

    查看此处了解更多信息Retaining an Object During a Configuration Change,您还可以在他们的网站上找到示例..

    谢谢..

    【讨论】:

      【解决方案4】:

      转到 Manifest 并添加android:configChanges="orientation|screenSize"

       <activity android:name=".MainActivity">
                  <intent-filter>
                      <action android:name="android.intent.action.MAIN"
                          android:configChanges="orientation|screenSize"
                          />
      

      在主活动中:复制并粘贴此代码:

       @Override
          public void onConfigurationChanged(Configuration newConfig) {
              super.onConfigurationChanged(newConfig);
      
      
          }
      

      全部完成 -

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-05
        • 2011-07-10
        • 2010-12-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多