Android EditText有时会在应用程序恢复时丢失输入
-
02-01-2020 - |
题
我已经做了一个基本的数据日志记录应用程序,它应该将用户输入值放入一个动态的,通常是大量的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
-我没有重写任何生命周期方法(即onStop(),onResume()等。)除了onCreate()。我的活动中的其他方法都不应该与问题有关/据我所知
解决方案
我相信问题是,当你的应用程序处于"空闲"状态时(即转到后台,屏幕关闭),Android会自动清理它并销毁所有数据,包括您的 EditTexts
.
如果一个活动被暂停或停止,系统可以通过要求它完成或简单地杀死它的进程来从内存中删除该活动。当它再次显示给用户时,它必须完全重新启动并恢复到以前的状态。
http://developer.android.com/reference/android/app/Activity.html
要解决此问题,您可以复盖 onSavedInstanceState()
保存您的 EditText
值,然后 onCreate()
当你回到活动时,会把这些值拉回来。然后,您将需要检查到位,看看是否需要重新填充您的 EditTexts
从这些值或者如果它们是空的。更多关于这个 这里.
其他提示
这可能正在发生BecozStex或onpause方法在空闲时间中调用。ondestroy将在套件中调用内存是应用程序的使用率很高。我认为唯一的解决方案是在输入的本地DB中保存数据,并重新填充IT onResume。
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();
}
}
.