Вид сброса активности при изменении ориентации - PullRequest
1 голос
/ 18 сентября 2011

У меня есть некоторые проблемы с изменением ориентации 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 (при изменении ориентации) (я думаю, проблема в том, что контекст кнопки является предыдущим действием)

Обновлен код:

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);
    }

}

Я думаю, что на новой кнопке должно появиться «Hello"текст, но этого не происходит.Что не так?

Ответы [ 3 ]

2 голосов
/ 18 сентября 2011

Переопределите обратный вызов onSaveInstanceState() в вашей активности. Сохраните все данные в пакет, который вы получите этим методом. В onCreate вашей активности проверьте комплект savedInstance на ноль. Если оно не равно нулю, прочитайте и примените данные к вашим представлениям.

Обновление

Не проверять на нулевое значение в методе createBtn.

public void createBtn(Context context, LinearLayout layout) {
        btn = new Button(context);
        layout.addView(btn);
}

Обновление 2

Сделать переменную container статической. Я думаю, что вы теряете значения при возобновлении активности.

1 голос
/ 19 сентября 2011

Попробуйте это: Добавьте это в свою декларацию активности в файле manifiest.xml:

android:configChanges="orientation|keyboardHidden"
1 голос
/ 18 сентября 2011

Все будет хорошо, если вы сохраните все свои данные в onPause () и загрузите их обратно в onResume ().

...