我已经制作了一个基本的数据记录应用程序,它应该将用户输入值转换为动态且经常大量的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()等)。在我的活动中,没有其他方法应该与问题/我可以告诉
有任何关系答案 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();
}
}