当App恢复时,Android EditText有时会丢失输入

时间:2014-08-01 15:34:42

标签: java android xml eclipse data-persistence

我已经制作了一个基本的数据记录应用程序,它应该将用户输入值转换为动态且经常大量的EditText视图。一旦用户输入完所有数据,就可以按下一个按钮来拍摄数据条目的图片(关于我将输入存储为图片,有特定原因),并将图片保存到存储

问题: 除了一个特定问题外,它的效果非常好。有时,当用户将手机置于空闲状态(在输入实际保存之前经常发生)时,EditText视图中的所有输入都将清除(使我成为一个非常愤怒/悲伤的人)。更重要的是,当我在现场并且无法查看eclipse中的日志文件以确定哪些方法可能与正常方法不同时,它才会发生。

问题: 为什么我的EditTexts中的值在电话进出闲置的大部分时间内都会持续存在,但它们会在看似随机(通常不方便)的情况下清除?

我有一种感觉,这是由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

- 除了onCreate()之外,我没有覆盖任何生命周期方法(即onStop(),onResume()等)。在我的活动中,没有其他方法应该与问题/我可以告诉

有任何关系

3 个答案:

答案 0 :(得分:1)

我认为问题在于,当您的应用程序“闲置”(即进入后台,屏幕关闭)时,Android会自动清理它并销毁所有数据,包括{{1}中的数据}。

  

如果某个活动暂停或停止,系统可以通过要求完成活动或仅删除其进程来从内存中删除活动。当它再次显示给用户时,必须完全重新启动并恢复到之前的状态。

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

要解决此问题,您可以覆盖EditTexts方法以保存onSavedInstanceState()值,然后EditText会在您返回活动时将这些值拉回来。然后,您需要检查是否需要从这些值重新填充onCreate()或者它们是否为空。有关here的更多信息。

答案 1 :(得分:0)

这可能发生在空闲时间调用ondestroy或onpause方法。 ondestroy将在内存中调用内存使用app很高。在我看来,唯一的解决方案是在输入时将数据保存在本地数据库中,然后在onresume上重新填充它。

答案 2 :(得分:0)

要在Activity的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();

    }   
}