← Назад к вопросам

Всегда ли сохраняется текст в EditText?

2.0 Middle🔥 91 комментариев
#Android компоненты#UI и вёрстка#Жизненный цикл и навигация

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Введение

Короткий ответ — нет, текст в EditText не сохраняется автоматически при изменении конфигурации (например, повороте экрана) или при завершении работы приложения. По умолчанию EditText ведет себя как обычная View, и его состояние (введенный текст) не сохраняется между изменениями жизненного цикла активности (Activity). Однако разработчик может реализовать сохранение состояния несколькими способами.

Механизмы сохранения состояния

1. Автоматическое сохранение через android:freezesText

В EditText существует атрибут android:freezesText. Если установить его в true в XML-разметке, текст будет автоматически сохраняться и восстанавливаться при изменении конфигурации (например, повороте экрана). Это работает благодаря механизму Parcelable, который сохраняет состояние TextView (родительского класса EditText).

<EditText
    android:id="@+id/editText"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:freezesText="true" />

Ограничение: Этот способ не сохраняет текст при полном завершении приложения (например, из-за нехватки памяти системой Android).

2. Сохранение через onSaveInstanceState() и onRestoreInstanceState()

Активность и фрагменты имеют методы onSaveInstanceState() и onRestoreInstanceState(), которые позволяют вручную сохранить состояние EditText.

Пример в Activity:

class MainActivity : AppCompatActivity() {
    private lateinit var editText: EditText

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        editText = findViewById(R.id.editText)
        
        // Восстановление состояния
        savedInstanceState?.getString("EDIT_TEXT_KEY")?.let {
            editText.setText(it)
        }
    }

    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        outState.putString("EDIT_TEXT_KEY", editText.text.toString())
    }
}

3. Использование ViewModel и LiveData

Для сохранения данных при повороте экрана и управления конфигурациями рекомендуется использовать архитектурные компоненты Android, такие как ViewModel. ViewModel переживает изменения конфигурации, что позволяет сохранить текст EditText.

Пример с ViewModel:

class MainViewModel : ViewModel() {
    val textLiveData = MutableLiveData<String>()

    fun saveText(text: String) {
        textLiveData.value = text
    }
}

class MainActivity : AppCompatActivity() {
    private lateinit var viewModel: MainViewModel
    private lateinit var editText: EditText

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        editText = findViewById(R.id.editText)
        
        viewModel = ViewModelProvider(this).get(MainViewModel::class.java)
        
        // Восстановление текста из ViewModel
        viewModel.textLiveData.observe(this) { savedText ->
            editText.setText(savedText)
        }
        
        // Сохранение текста при изменении (например, через TextWatcher)
        editText.addTextChangedListener(object : TextWatcher {
            override fun afterTextChanged(s: Editable?) {
                viewModel.saveText(s.toString())
            }
            // ... другие методы TextWatcher
        })
    }
}

4. Постоянное сохранение с помощью SharedPreferences, базы данных или файлов

Для долговременного хранения текста (между запусками приложения) используются:

  • SharedPreferences — для простых данных.
  • Room Database — для структурированных данных.
  • Файловая система — для больших объемов текста.

Пример с SharedPreferences:

class MainActivity : AppCompatActivity() {
    private lateinit var editText: EditText
    private val prefs = "MyPrefs"

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        editText = findViewById(R.id.editText)
        
        // Загрузка сохраненного текста
        val sharedPref = getSharedPreferences(prefs, Context.MODE_PRIVATE)
        editText.setText(sharedPref.getString("saved_text", ""))
    }

    override fun onPause() {
        super.onPause()
        // Сохранение текста при приостановке активности
        val sharedPref = getSharedPreferences(prefs, Context.MODE_PRIVATE)
        sharedPref.edit().putString("saved_text", editText.text.toString()).apply()
    }
}

Практические рекомендации

  • Для сохранения при повороте экрана: Используйте ViewModel — это современный и рекомендуемый подход.
  • Для долговременного хранения: Используйте SharedPreferences, Room или другие механизмы в зависимости от сложности данных.
  • Автоматическое сохранение: Атрибут android:freezesText может быть полезен в простых сценариях, но он менее гибкий и не работает при полном завершении приложения.

Вывод

Текст в EditText не сохраняется по умолчанию при изменении конфигурации или завершении приложения. Однако разработчик может легко реализовать сохранение с помощью:

  • android:freezesText для простых случаев,
  • методов жизненного цикла onSaveInstanceState(),
  • ViewModel для архитектурно чистого решения,
  • постоянного хранилища (SharedPreferences, база данных) для долговременного сохранения.

Выбор метода зависит от требований приложения: временное сохранение при повороте экрана или постоянное хранение между сессиями.

Всегда ли сохраняется текст в EditText? | PrepBro