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

本文介绍了一种在使用EditText时通过自定义类实现延时触发更改事件的方法,以减少输入长数据时的重复保存操作,提高用户体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

每次想要实现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);
			}
		});

	}

}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值