Android Activity的方向更改存在一些问题。
我有一个游戏和一些飞行气球。气球(ImageViews
)是动态创建的,因此它们正在飞行。但是当我改变设备方向(到港口或陆地)时,活动正在重新创建,我的气球正在消失。当我转到下一个活动,然后回到我的气球活动时,会发生同样的事情。
有没有办法在我的活动中“保存”我动态创建的气球(以及它的位置和其他属性)
我也试过了getLastNonConfigurationInstance() / onRetainNonConfigurationInstance()
,但在我看来它可以处理数据,而不是View
元素(可能是因为这些视图的父级是之前的活动)
public class Singleton {
private static final Singleton instance = new Singleton();
private Button btn;
private Singleton() {
}
public static Singleton getInstance() {
return instance;
}
public void createBtn(Context context, LinearLayout layout) {
if (btn == null) {
btn = new Button(context);
layout.addView(btn);
}
}
}
public class TestActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Singleton s = Singleton.getInstance();
s.createBtn(this, ((LinearLayout) findViewById(R.id.baseLayout)));
}
}
按钮不会出现在第二个onCreate上(在更改方向上)(我认为问题是Button的Context是之前的Activity)
public class Singleton {
private static final Singleton instance = new Singleton();
private Button btn;
private SparseArray<Parcelable> container;
private Singleton() {
}
public static Singleton getInstance() {
return instance;
}
public void createBtn(Context context, LinearLayout layout) {
if (btn == null) {
btn = new Button(context);
layout.addView(btn);
btn.setText("Hello");
saveBtn();
} else if (container != null){
btn = new Button(context);
btn.restoreHierarchyState(container);
layout.addView(btn);
}
}
public void saveBtn() {
container = new SparseArray<Parcelable>();
btn.saveHierarchyState(container);
}
}
我认为新的Button应该出现“Hello”文本,但它不会发生。怎么了?
答案 0 :(得分:2)
覆盖您活动中的onSaveInstanceState()
回调。将所有数据保存到您在此方法中收到的包中。在您的onCreate
活动中,检查savedInstance
包是否为空。如果它不为空,请回读并将数据应用于您的视图。
请勿在{{1}}方法中检查空值。
createBtn
将public void createBtn(Context context, LinearLayout layout) {
btn = new Button(context);
layout.addView(btn);
}
变量设为静态。我认为你在活动重启时会丢失这些值。
答案 1 :(得分:1)
如果将所有数据存储在onPause()中并将其加载回onResume(),则应该没问题。
答案 2 :(得分:1)
试试这个: 将其添加到manifest.xml文件中的活动声明部分:
android:configChanges="orientation|keyboardHidden"