2013-10-25 5 views
1

Я создаю приложение для Android с активностью, состоящей из смеси статических представлений и динамически созданных представлений. Активность содержит элементы пользовательского интерфейса, хранящиеся в файле XML и элементах пользовательского интерфейса, которые создаются динамически на основе содержимого класса модели. (как и в, в моем классе модели есть массив и будет создан EditText для каждого элемента массива .. и будет создан Spinner, содержащий каждый элемент в другом массиве)Сохранение и восстановление состояния экземпляра в динамически создаваемом пользовательском интерфейсе?

Какой обычный способ сохранения и восстановление состояния приложения, когда задействованы динамически созданные элементы пользовательского интерфейса? Потому что я не всегда буду знать, какие элементы пользовательского интерфейса будут существовать в любой момент! В настоящее время мой код привязки просто перезагружает данные из базы данных, когда меняется ориентация устройства, теряя любые изменения, внесенные пользователем.

У меня был хороший взгляд на Google/SO для этого, и я не нашел ничего связанного с этой проблемой.

Спасибо всем

Edit: Для всех, кто попадается это в будущем, я слегка измененный вариант подхода Yakiv и завелся с этим:

for (int i = 0; i < views.size(); i++) { 
     View currentView = views.get(i); 
     if (currentView instanceof CheckBox) { 
      outState.putBoolean("VIEW"+i, (((CheckBox) currentView).isChecked())); 
     } else if (currentView instanceof EditText) { 
      outState.putString("VIEW"+i, ((EditText) currentView).getText().toString()); 
     } else if (currentView instanceof Spinner) { 
      //.....etc. etc. 
     } 
    } 

Еще раз спасибо Yakiv за потрясающую идею.

+0

Вы были не в своем поиске, вот ответ - http://stackoverflow.com/questions/151777/saving-activity-state-in-android. –

+0

Спасибо за вашу ссылку, но поскольку я ответил на комментарий Якива, это для простейшего случая, когда вы знаете, какие элементы пользовательского интерфейса у вас есть, и можете легко хранить их в комплекте. Я не буду знать, какие элементы пользовательского интерфейса у меня есть, поскольку они динамически генерируются. Активность может иметь 5 edittexts или может иметь 50, что затрудняет добавление этих значений в пакет. – user2459186

ответ

0

Чтобы восстановить динамические представления, вам необходимо сделать их как class fields и инициализировать их в onCreate. Затем просто используйте статью this, чтобы сохранить и восстановить их состояние.

private List<View> mViews= new ArrayList<View>(); 

@Override 
public void onCreate(..) 
{ 
    LinearLayout parent = ....//initialize it here 
    initializeViews(); 
} 

public void initializeViews() 
{ 
    // create and add 10 (or what ever you need) views to the list here 
    mViews.add(new View(this)); 
} 

@Override 
public void onSaveInstanceState(Bundle savedInstanceState) { 
    super.onSaveInstanceState(savedInstanceState); 

    int mViewsCount = 0; 
    for(View view : mViews) 
    { 
    savedInstanceState.putInt("mViewId_" + mViewsCount, view.getId()); 
    mViewsCount++; 
    } 

    savedInstanceState.putInt("mViewsCount", mViewsCount); 
} 

@Override 
public void onRestoreInstanceState(Bundle savedInstanceState) { 
    super.onRestoreInstanceState(savedInstanceState); 

    int mViewsCount = savedInstanceState.getInt("mViewsCount");; 
    for(i = 0; i <= mViewsCount) 
    { 
    View view = mViews.get(i); 

    int viewId = savedInstanceState.getInt("mViewId_" + i); 
    view.setId(viewId); 

    mViewsCount++; 
    } 
} 

С наилучшими пожеланиями.

+0

Спасибо за ваш ответ. Я немного смущен, но проблема в том, что в моей деятельности может быть 5 EditTexts, или может быть 50 .. Так что в onSaveInstanceState у меня нет способа добавить значения к набору, потому что не будет уникальный «ключ» (например, «dogColour» или «dogName», если это имеет смысл) – user2459186

+0

Обновленный ответ. –

+0

Это действительно очень приятное решение, большое спасибо за вашу помощь! Я отвечу, если у меня возникнут проблемы – user2459186

Смежные вопросы