Android EditText иногда теряет вводимые данные при возобновлении работы приложения

StackOverflow https://stackoverflow.com//questions/25083753

Вопрос

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

Проблема: Это работает очень хорошо, за исключением одной конкретной проблемы.Иногда, когда пользователь переводит телефон в режим ожидания (что часто происходит до того, как ввод фактически сохраняется), все входные данные в представлениях EditText очищаются (что делает меня очень злым / грустным человеком).Более того, это происходит только тогда, когда я нахожусь в полевых условиях и не могу просмотреть файлы журналов в eclipse, чтобы выяснить, какие методы могут вызываться не так, как обычно.

Вопрос:Почему значения в моих текстах редактирования сохраняются большую часть времени, когда телефон переходит в режим ожидания и обратно, но они очищаются в, казалось бы, случайных (и часто неудобных) случаях?

У меня есть ощущение, что это вызвано тем, что в определенных случаях вызывается onStop () вместо onPause () (или, возможно, наоборот), но мои знания об этих методах пока не совсем на должном уровне.Кроме того, я знаю, что эта проблема может быть решена с помощью файла SharedPreferences (или какой-то подобной идеи), но я хотел бы знать, что происходит, больше для понимания, чем для чего-либо еще.

Подробные сведения:

-Я не уверен, что какой-либо из этих кодов может иметь отношение к вопросу значимым образом, но я включу фрагмент моего метода onCreate(), если это поможет.Дайте мне знать, если я должен добавить что-нибудь еще:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_input_param);

    Intent intent = getIntent();
//Rest of the code just builds the layout from data taken from the intent

-Я не переопределял ни один из методов жизненного цикла (т. е.onStop(), onResume() и т.д.), за исключением onCreate().Ни один из других методов в моей деятельности не должен иметь никакого отношения к проблеме / насколько я могу судить

Это было полезно?

Решение

Я считаю, что проблема в том, что в моменты, когда ваше приложение "простаивает" (т.е.переход в фоновый режим, экран выключен), что Android автоматически очищает его и уничтожает все данные, включая те, что в вашем EditTexts.

Если действие приостановлено или остановлено, система может удалить это действие из памяти, либо попросив его завершить, либо просто завершив его процесс.Когда он снова будет показан пользователю, его необходимо полностью перезапустить и восстановить в прежнее состояние.

http://developer.android.com/reference/android/app/Activity.html

Чтобы устранить эту проблему, вы можете переопределить onSavedInstanceState() способ сохранения вашего EditText значения, а затем onCreate() вернет эти значения обратно, когда вы вернетесь к заданию.Затем вам понадобится проверка на месте, чтобы узнать, нужно ли вам повторно заполнять ваш EditTexts из этих значений или если бы они были нулевыми.Подробнее об этом здесь.

Другие советы

Это, вероятно, происходит, потому что метод ondestroy или OnPause вызывается в простом времени.OnDestroy будет вызван в CONDED. Память - это использование приложения высокое.Единственное решение, на мой взгляд, состоит в том, чтобы сохранить данные в локальной БД, как он вводится, и заполните его OnResume.

Чтобы решить вашу проблему в методе OnPause () Вашей активности, возьмите значения, вставленные пользователем в статические переменные (вам потребуется количества переменных, насколько у вас есть Edittext у вас) и хранит значения в переменных и в OnResume () Положите значения обратно на EDitText.

package com.zeus.program;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.EditText;

public class MainActivity extends Activity {

    public static String username;
    public static String password;


    EditText usernameET;
    EditText passwordET;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        usernameET = findViewById(R.id.username);
        passwordET = findViewById(R.id.password);
    }


    @Override
    protected void onResume() {
        // TODO Auto-generated method stub
        super.onResume();

        usernameET.setText(username);
        passwordET.setText(password);

    }

    @Override
    protected void onPause() {
        // TODO Auto-generated method stub
        super.onPause();

        username = usernameET.getText().toString();
        password = passwordET.getText().toString();

    }   
}
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top