Android 关于方向更改的活动重置视图

Android 关于方向更改的活动重置视图,android,android-2.2-froyo,Android,Android 2.2 Froyo,我对Android Activity的方向更改有一些问题 我有一个游戏和一些飞行的气球。气球(imageview)是动态创建的,因此它们会飞行。但当我改变设备方向(端口或陆地)时,活动正在重新创建,我的气球正在消失。当我转到下一个活动,然后又回到我的气球活动时,也会发生同样的事情 有没有办法在我的活动中“保存”我动态创建的引出序号(及其位置和其他属性) 我还尝试了getLastNonConfigurationInstance()/onretainonconfigurationinstance()

我对Android Activity的方向更改有一些问题

我有一个游戏和一些飞行的气球。气球(
imageview
)是动态创建的,因此它们会飞行。但当我改变设备方向(端口或陆地)时,活动正在重新创建,我的气球正在消失。当我转到下一个活动,然后又回到我的气球活动时,也会发生同样的事情

有没有办法在我的活动中“保存”我动态创建的引出序号(及其位置和其他属性)

我还尝试了
getLastNonConfigurationInstance()/onretainonconfigurationinstance()
,但在我看来,这是在处理数据,而不是
View
元素(可能是因为这些视图的父视图是以前的活动)

按钮不会在第二次创建时出现(在更改方向上)(我认为问题在于按钮的上下文是以前的活动)

更新代码:
公共类单例{
私有静态最终单例实例=新单例();
专用按钮btn;
私人Sparsarray容器;
私人单身人士(){
}
公共静态单例getInstance(){
返回实例;
}
公共void createBtn(上下文、线性布局布局){
如果(btn==null){
btn=新按钮(上下文);
布局。添加视图(btn);
btn.setText(“你好”);
saveBtn();
}else if(容器!=null){
btn=新按钮(上下文);
btn.还原铁酸盐(容器);
布局。添加视图(btn);
}
}
公共void saveBtn(){
容器=新SparseArray();
btn.saveHierarchyState(容器);
}
}

我认为在新按钮上应该出现“Hello”文本,但事实并非如此。有什么问题吗?

如果将所有数据存储在onPause()中,并将其加载回onResume(),则应该没有问题。

如果将所有数据存储在onPause()中,并将其加载回onResume(),则应该没有问题。

覆盖活动中的
onSaveInstanceState()
回调。将所有数据保存到此方法中接收的捆绑包中。在活动的
onCreate
中,检查
savedInstance
捆绑包是否为空。如果不为null,请读回数据并将其应用于视图

更新 不要在
createBtn
方法中检查null

public void createBtn(Context context, LinearLayout layout) {
        btn = new Button(context);
        layout.addView(btn);
}
更新2
容器
变量设为静态。我认为当活动重新启动时,您正在丢失这些值。

覆盖活动中的
onSaveInstanceState()
回调。将所有数据保存到此方法中接收的捆绑包中。在活动的
onCreate
中,检查
savedInstance
捆绑包是否为空。如果不为null,请读回数据并将其应用于视图

更新 不要在
createBtn
方法中检查null

public void createBtn(Context context, LinearLayout layout) {
        btn = new Button(context);
        layout.addView(btn);
}
更新2 将
容器
变量设为静态。我认为当活动重新启动时,您正在丢失这些值。

尝试以下方法: 将其添加到manifiest.xml文件中的活动声明部分:

android:configChanges="orientation|keyboardHidden"
试试这个: 将其添加到manifiest.xml文件中的活动声明部分:

android:configChanges="orientation|keyboardHidden"

看我的例子,我想你会理解我的问题,你说的“将数据应用到你的观点”。您的意思是我应该保存视图的属性,然后将这些数据放到新视图中吗?但是有很多属性都发生了变化。还有动画。例如,正在播放动画,当用户更改设备方向时,我希望在新活动(由新方向创建)中继续播放动画,我不需要创建新按钮。我只想在新活动中使用带有属性的旧按钮。阅读以下内容:“例如,正在播放动画,当用户更改设备方向时,我希望在新活动(由新方向创建)中继续播放动画”。此动画已附加到旧按钮,并应在新activityLook上继续。我创建按钮;设置其属性-文本、边距等。;开始设置此按钮的动画。然后用户更改设备方向。活动被破坏了,我的按钮也被破坏了。但是我希望新活动中出现了按钮,按钮的文本、边距和动画应该继续,然后您应该保存整个视图的层次结构,并在
onCreate
中恢复。使用
saveHierarchyState(SparseArray容器)
进行保存,使用
restoreHierarchyState(SparseArray容器)
进行还原。请看我的示例,我想这样您就会理解我的问题,您说过“将数据应用于您的视图”。您的意思是我应该保存视图的属性,然后将这些数据放到新视图中吗?但是有很多属性都发生了变化。还有动画。例如,正在播放动画,当用户更改设备方向时,我希望在新活动(由新方向创建)中继续播放动画,我不需要创建新按钮。我只想在新活动中使用带有属性的旧按钮。阅读以下内容:“例如,正在播放动画,当用户更改设备方向时,我希望在新活动(由新方向创建)中继续播放动画”。此动画已附加到旧按钮,并应在新activityLook上继续。我创建按钮;设置其属性-文本、边距等。;开始设置此按钮的动画。然后用户更改设备方向。活动被破坏了,我的按钮也被破坏了。但是我希望新活动中出现了按钮,按钮的文本、边距和动画应该继续,然后您应该保存整个视图的层次结构,并在
onCreate
中恢复。使用
saveHierarchyState(SparseArray容器)
进行保存,使用
restoreHierarchyState(SparseArray容器)
进行恢复。我觉得这样做很好。它有什么区别?不工作(您可以测试它在还原之前检查您的容器是否确实包含值。记录值。如果缺少值,则意味着在重新创建