方向更改时的活动重置视图

时间:2011-09-18 17:52:24

标签: android android-2.2-froyo

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”文本,但它不会发生。怎么了?

3 个答案:

答案 0 :(得分:2)

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

更新

请勿在{{1​​}}方法中检查空值。

createBtn

更新2

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"