2013-10-07 3 views
9

Я читал, что Android автоматически сохраняет содержимое объектов EditText, когда приложение будет остановлено или убито. Однако в моем приложении содержимое EditText теряется при изменении ориентации экрана.EditText не сохраняется автоматически при изменении ориентации экрана

Это нормальное поведение? Нужно ли мне вручную сохранять/восстанавливать его содержимое с помощью onSaveInstanceState/onRestoreInstanceState? Или есть более простой способ сказать Android, чтобы сохранить его, восстановить его?

Edit:

Я создаю EditText объект программно, а не в XML. Это оказывается связанным с проблемой (см. Принятый ответ ниже).

ответ

22

Это ненормальное поведение.

Прежде всего, убедитесь, что у вас есть идентификаторы, назначенные вашим элементам управления EditText в формате XML.

Редактировать 1: Ему просто нужен идентификатор, период. Если вы делаете это программно, оно потеряет состояние, если оно не имеет идентификатора.

Таким образом, используя это в качестве быстрой & грязного например:

// Find my layout 
    LinearLayout mLinearLayout = (LinearLayout) findViewById(R.id.ll1); 
    // Add a new EditText with default text of "test" 
    EditText testText = new EditText(this.getApplicationContext()); 
    testText.setText("test"); 


    // This line is the key; without it, any additional text changes will 
    // be lost on rotation. Try it with and without the setId, text will revert 
    // to just "test" when you rotate. 

    testText.setId(100); 

    // Add your new EditText to the view. 
    mLinearLayout.addView(testText); 

Это позволит решить вашу проблему.

Если это не удастся, вам нужно сохранить и восстановить состояние самостоятельно.

Override onSaveInstanceState так:

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putString("textKey", mEditText.getText().toString()); 
} 

А затем восстановить в OnCreate:

public void onCreate(Bundle savedInstanceState) { 
    if(savedInstanceState != null) 
    { 
     mEditText.setText(savedInstanceState.getString("textKey")); 
    } 
} 

Кроме того, пожалуйста, не используйте android:configChanges="orientation", чтобы попытаться сделать это, это неправильный путь.

+0

Спасибо. Я создаю этот editText в Java (программно), а не в XML. Таким образом, у editText отсутствует XML-идентификатор. Может быть, это и есть причина? Android не будет сохранять просмотры, созданные программно?Однако он сохраняет состояние радиогруппы, которая также была создана программно. Weird –

+0

Извините за путаницу: состояние radioGroup фактически сохраняется через мой код (который сохраняет и затем извлекает настройки приложения), а не системой. Я удалил этот код и проверил, что система выполняет _not_ сохранение состояния этого представления. Поэтому это должно быть причиной: программно созданные представления не имеют XML-идентификатора и поэтому не сохраняются автоматически. Как вы думаете? Имеет ли это смысл? –

+0

Ему просто нужен идентификатор, период! Проверьте мое редактирование, и если оно работает, примите ответ, пожалуйста. :) –

1

Вы можете использовать android:freezesText="true" в формате xml?

+0

Спасибо за предложение. Я создаю editText в Java, а не в XML. Я попробовал 'editText.setFreezesText (true);' но это не сработало. –

+2

Это немного нюансировано, но вам действительно нужно использовать freezesText для TextView, а не для EditText. Android, похоже, беспокоит сохранение состояния для элементов, которые могут измениться; EditText предназначен для редактирования, поэтому, если у него есть идентификатор, Android сохранит состояние при мягком убийстве (хотя и не в жестком выходе). TextView - это наоборот, поэтому имеет смысл явно сохранять состояние, если оно там необходимо. –

2

Самый простой способ я нашел, чтобы сохранить объект на onSaveInstanceState является реализация сериализации и положить в пачке

@Override 
protected void onSaveInstanceState(Bundle outState) { 
super.onSaveInstanceState(outState); 
outState.putSerializable("myObj", myObj); 
} 

где myObj класс реализует сериализации и метод OnCreate()

if (savedInstanceState != null && savedInstanceState.getSerializable("myObj") != null) { 
myObj = ((MyObj) savedInstanceState.getSerializable("myObj")); 
} 
+0

Спасибо. На самом деле я хотел, чтобы Android сделал это для меня. Оказывается, присвоение идентификатора объекту достаточно, чтобы заставить Android выполнять работу (см. Ответ Майка П.) –

1

Один из возможных причина в том, что вы переопределяете onSaveInstanceState, но вы забудете назвать то же самое для суперкласса

super.onSaveInstanceState (outState);

Состояние всех видов в действии автоматически сохраняется, ЕСЛИ вы не отменяете эту функциональность. Даже если это очевидно, возможны ошибки.

+0

На самом деле моя проблема заключалась в том, что у объекта не было идентификатора, потому что я его создавал в Java, а не в XML. Но спасибо за идею; это может быть полезно для других –

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