在做调色盘的例子时,除了通过按钮点击“+”和“-”来改变rgb的值,还需要能够直接改变EditText的值来调颜色,这个时候需要用到EditText的监听接口TextWatcher。
因为要同时监听三个EditText,所以用一个类TextChange继承TextWatcher。
//对EditText值监听
public class TextChange implements TextWatcher{
private EditText EditId = null;
public TextChange(EditText id){
EditId = id;
}
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
if(EditId == et_red){
r = Integer.parseInt(et_red.getText().toString());
if(r>255){
r=0;
}
if(r<0){
r=255;
}
et_red.removeTextChangedListener(this);
et_red.setText(""+r);
et_red.addTextChangedListener(this);
tv_color.setBackgroundColor(Color.rgb(r,g,b));
}
if(EditId == et_green){
g = Integer.parseInt(et_green.getText().toString());
if(g>255){
g=0;
}
if(g<0){
r=255;
}
et_green.removeTextChangedListener(this);
et_green.setText(""+g);
et_green.addTextChangedListener(this);
tv_color.setBackgroundColor(Color.rgb(r,g,b));
}
if(EditId == et_blue){
b = Integer.parseInt(et_blue.getText().toString());
if(b>255){
b=0;
}
if(g<0){
r=255;
}
et_blue.removeTextChangedListener(this);
et_blue.setText(""+b);
et_blue.addTextChangedListener(this);
tv_color.setBackgroundColor(Color.rgb(r,g,b));
}
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
}
然后每个EditText使用addTextChangedListener(TextWatcher watcher)方法对EditText实现监听
et_red = (EditText)findViewById(R.id.et_red);
et_green = (EditText)findViewById(R.id.et_green);
et_blue = (EditText)findViewById(R.id.et_blue);
et_red.addTextChangedListener(new TextChange(et_red));
et_green.addTextChangedListener(new TextChange(et_green));
et_blue.addTextChangedListener(new TextChange(et_blue));
不过在使用TextWatcher时,若在afterTextChanged方法中调用setText()来改变EditText的值,就会出现死循环,然后app卡死,那么会重复触发对此方法的递归死循环调用, 产生ANR。所以需要在setText()前移除对EditText的监听接口,在setText()之后再绑定接口。
et_red.removeTextChangedListener(this);
et_red.setText(""+r);
et_red.addTextChangedListener(this);