手写一个监听数据变化的布局

最近写的项目数据完全是依赖手机录入

为了更好的用户体验在用户点击返回的时候需要判断当前页面是否修改多数据

所以就有了这个东西,不难,留下做个记录。


原理

需要记录数据的时候,递归循环布局下所有ViewGroup将EditText、RadioGroup等等数据保存到一个Map中

然后返回按钮的时候在重新训话所有ViewGroup下的EditText、RadioGroup去和Map做比较,如果有不一样就中断循环返回true代表有数据改变

关键代码


public booleangetViewState(View child) {

if(childinstanceofRadioGroup) {

    RadioGroup radioGroup = (RadioGroup) child;

    if(null!=vMap.get(child.getId())) {

        if(!vMap.get(child.getId()).equals(radioGroup.getCheckedRadioButtonId() +"")) {

        return true;

        }

    }

}

if(childinstanceofEditText) {

    EditText editText = (EditText) child;

    if(null!=vMap.get(child.getId())) {

        if(!vMap.get(child.getId()).equals(editText.getText().toString())) {

        return true;

        }

    }

}

if(childinstanceofViewGroup) {

    ViewGroup var4 = (ViewGroup) child;

    for(intj =0; j < var4.getChildCount(); j++) {

        if(this.getViewState(var4.getChildAt(j))) {

        return true;

        }

    }

}

return false;

}


然后就遇见了新需求

如果数据有改变底部出现一个按钮标识有改变可以保存修改,难不倒我

首先创建一个接口

public interfaceChangeListener {

/**

* edittext内容改变的时调用此接口

*/

voideditChang(booleanifChange);

}

然后监听EditText内容变化,每次改变判断是否改变了数据,RadioGroup也一样

TextWatcher textWatcher=new TextWatcher() {

@Override

public voidbeforeTextChanged(CharSequence s,intstart,intcount,intafter) {

}

@Override

public voidonTextChanged(CharSequence s,intstart,intbefore,intcount) {

    if(null!=changeListener) {

    changeListener.editChang(getViewState(getThis()));

    }

}

};

你可能感兴趣的:(手写一个监听数据变化的布局)