2011-12-05 52 views
1

我有兴趣知道在Android设备旋转(即配置更改)时哪些方法被覆盖?已更改Android配置

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

这将是也很有趣,我听关于与改变配置连接的全过程。谢谢。

回答

3

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

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

凡为会当你旋转设备(注意,这才会被调用,如果你选择的配置,你想与configChanges属性来处理你的清单)被调用。从参数中您将获得新的设备配置。

如果您不想让您的活动在Device旋转时重新创建,那么您必须将此行添加到AndroidManifest文件中的活动标记中。

android:ConfigChanges="keyboardHidden|orientation" 
+0

我有这个问题。我有两种布局:一种用于景观,另一种用于肖像。我有一个文本视图。我不想失去旋转时输入的文字。到目前为止,我使用onConfigurationChanged,基本上与onCreate中的工作人员相同。问题是,在onConfigurationChanged我没有一个捆绑软件,我无法保存/检索输入的文本。当我使用onSaveInstanceState()和onConfigurationChanged()时,第一个不起作用。我不知道如何解决这个问题.... – lomza

+0

您检索onCreate()中的Bundle值并进一步使用它。 –

+0

我明白我的错误,我不必使用configChanges。我只需要重写onSaveInstanceState和onRestoreInstanceState。在那里我可以保存/检索我的文本视图,布局配置处理是自动完成的,所以我不需要做其他任何事情。 onConfigurationChanged覆盖了一切,我不需要如此复杂的逻辑。 – lomza

2

从Android开发者...

要在运行时的结构变更时保留的对象:

  1. 覆盖的onRetainNonConfigurationInstance()方法返回你想保留的对象。
  2. 当再次创建您的活动,请拨打getLastNonConfigurationInstance()恢复您的对象。

的Android电话的onStop()和的onDestroy()时,它关闭您的活动之间onRetainNonConfigurationInstance()由于配置更改。在实现onRetainNonConfigurationInstance()时,您可以返回所需的任何对象,以便在配置更改后有效恢复您的状态。

中这可能是有价值的情景是,如果你的应用程序加载大量来自网络的数据。如果用户更改设备的方向并重新启动活动,则应用程序必须重新获取数据,这可能会很慢。您可以改为执行onRetainNonConfigurationInstance()以返回携带您的数据的对象,然后在您的活动再次以getLastNonConfigurationInstance()重新开始时检索数据。

看看这里获取更多信息Retaining an Object During a Configuration Change你还可以找到例如在他们的..

谢谢..

+0

谢谢。有用的信息;) – lomza

4

据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清单:

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

希望这有助于...

+0

感谢您的“处理运行时更改”链接。我目前正在使用onConfigurationChanged。 – lomza

+0

这个答案对我有帮助..但是关于用某种形式的'android:configChanges'更新清单的部分..我错过了,因为它是朝向底部,而且我的屏幕尺寸适中。这并不是什么大问题,但是在Java代码附近可能会有帮助。我在该方法中设置了断点,但是直到我意识到我需要清单更新时才触发它们。任何方式..感谢让我朝着正确的方向前进! – gnB

0

转到清单,并添加机器人:configChanges = “方向|屏幕尺寸”

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

In Main Ac tivity:复制并粘贴此代码:

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


    } 

全部完成 -