每次想要实现EditText更改后保存数据,都给EditText添加addTextChangedListener事件。但是由于输入比较长的数据时在中间过程中都会触发TextWatcher,从而每次都重复保存不必要的数据。为此自定义一个MyEditText继承EditText然后实现延时保存,减少在更改过程中保存数据的次数。实现比较简单,在此做个记录:
继承EditText实现延时触发更改事件:
package com.edittextdemo;
import android.annotation.SuppressLint;
import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.EditText;
public class MyEditText extends EditText {
private String TAG = "MyEditText";
private static final int MSGCODE = 0x12121212;
private mTextWatcher textWatcher = new mTextWatcher();
private String text;
private int msgCount = 0;
public MyEditText(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
this.addTextChangedListener(textWatcher);
}
private onTextChangerListener listener = null;
public void setOnTextChangerListener(onTextChangerListener listener) {
this.listener = listener;
}
public interface onTextChangerListener {
public void onTextChanger(String text);
}
private class mTextWatcher implements TextWatcher {
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
text = s.toString();
Log.e(TAG, "text = " + text);
msgCount++;
Message msg = new Message();
msg.what = MSGCODE;
mHandler.sendMessageDelayed(msg, 3 * 1000);
}
}
/**
* 防止调用setText时重新触发TextWatcher事件
*
* @param text
*/
public void MySetText(String text) {
removeTextChangedListener(textWatcher);
setText(text);
addTextChangedListener(textWatcher);
}
Handler mDelayedHandler = new Handler();
@SuppressLint("HandlerLeak")
Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
if (msg.what == MSGCODE) {
if (msgCount == 1) {
if (listener != null) {
listener.onTextChanger(text);
}
msgCount = 0;
} else {
msgCount--;
}
}
}
};
}
<com.edittextdemo.MyEditText
android:id="@+id/et_test"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20.0dip" />
MainActivity调用控件并实现事件监听:
package com.edittextdemo;
import com.edittextdemo.MyEditText.onTextChangerListener;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends Activity {
private String TAG = "MainActivity";
private MyEditText et_test = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_test = (MyEditText) findViewById(R.id.et_test);
et_test.setOnTextChangerListener(new onTextChangerListener() {
@Override
public void onTextChanger(String text) {
// TODO Auto-generated method stub
Log.e(TAG, "text = " + text);
et_test.MySetText(text);
}
});
}
}