Android学习之自定义EditText实现延时保存

来源:互联网 发布:java种颜色代码 编辑:程序博客网 时间:2024/06/10 07:39

每次想要实现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 stubthis.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 {@Overridepublic void beforeTextChanged(CharSequence s, int start, int count,int after) {// TODO Auto-generated method stub}@Overridepublic void onTextChanged(CharSequence s, int start, int before,int count) {// TODO Auto-generated method stub}@Overridepublic void afterTextChanged(Editable s) {// TODO Auto-generated method stubtext = 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;@Overrideprotected 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() {@Overridepublic void onTextChanger(String text) {// TODO Auto-generated method stubLog.e(TAG, "text = " + text);et_test.MySetText(text);}});}}




0 0
原创粉丝点击