我有一个带有活动的应用。此活动有EditText
字段。该字段将在活动方法onStart()
现在用户可以编辑他的名字并导航到下一个活动。我想检测用户是否确实进行了任何更改,以提示他保存更改。
因此,例如,用户名是" Sam Jones"并且他没有编辑它,我不想提示他保存。但是,如果他改变它只是" Sam"那我想提示他。
所以我在此TextWatcher
字段中添加了EditText
。我创建了一个布尔标志' MADE_CHANGES',我正在按照以下方式更改此标志。
TextWatcher textWatcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
MADE_CHANGES = true;
}
@Override
public void afterTextChanged(Editable editable) {
}
但是,甚至通过活动的onStart
方法调用此方法。可以理解的是,因为EditText
正在从一个空场变为" Sam Jones"。所以我的"保存"即使用户没有对他的名字进行任何更改,提示即将开始。
是否有优雅的解决方案来检查用户是否更改了EditText,同时排除了由onStart
触发的初始首次数据加载事件?
答案 0 :(得分:3)
从onStart()
设置文字时,请先删除TextWatcher
if(textWatcher != null){
myEditText.removeTextChangedListener(textWatcher);
}
并在设置文本后再次添加。对于这种方法,您必须使TextWatcher
成为您班级的一个字段。
答案 1 :(得分:0)
在运行活动开始时,onStart会发生OnResume,因此你可以使用一个标志:
private boolean isloaded;
@Override
protected void onResume() {
super.onResume();
isloaded=true;
}
@Override
protected void onStart() {
super.onStart();
isloaded=false;
}
on onCreate:
txt.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
if (isloaded)
MADE_CHANGES = true;
}
@Override
public void afterTextChanged(Editable editable) {
}
});