5

我制作了一个基本的数据记录应用程序,它应该让用户输入值到一个动态的并且通常是大量的 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() 等)。据我所知,我活动中的任何其他方法都与该问题无关

4

3 回答 3

1

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

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

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

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

于 2014-08-01T15:46:26.170 回答
0

这可能是因为在空闲时间调用了 ondestroy 或 onpause 方法。如果应用程序的内存使用率很高,则会调用 ondestroy。我认为唯一的解决方案是在输入数据时将数据保存在本地数据库中,然后在恢复时重新填充。

于 2014-08-01T15:44:01.623 回答
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();

    }   
}
于 2014-08-01T15:54:28.980 回答