EditText:检测用户输入更改与加载数据更改

时间:2017-12-15 18:05:04

标签: android android-edittext

我有一个带有活动的应用。此活动有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触发的初始首次数据加载事件?

2 个答案:

答案 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) {

        }
    });