Android EditText 仿软键盘删除按钮实现

今天封装了一个带删除按钮的EditText,想用这个按钮做到软件键盘按钮一样删除,即点击时删除一个而长按时可以连续删除,直到放开或者文本被删除完毕。

整理了一下button OnClickListener 和 OnLongClickListener两个回调接口,利用OnLongClickListener在按下就响应(有一定时间的) 而OnClickListener 在松开才响应。

因此可以在长按时间触发后开始删除文本字符串, 知道获得短按时间后停止。那么这个基本完成所需的要求。

下面说说具体实现代码:

首先重写点击和长按事件,并在长按时启动删除字符的线程,在点击事件(手放开时)停止线程。

// 添加按钮点击事件
		ib.setOnClickListener(new OnClickListener() { // 点击

			@Override
			public void onClick(View v) {
				if(ONLONGCLICKDOWN != 1){ // 非常长按事件
					Log.e(TAG, "-----setOnClickListener--------------->>>");
					inputStr = removeLastStr(inputStr);
					if(inputStr == null){
						inputStr = "";
						hideBtn();// 隐藏按钮
					}
					et.setText(inputStr);// 设置输入框内容为空
				}
				ONLONGCLICKDOWN = 0;
				flag = true;
				//				
			}
		});
		ib.setOnLongClickListener(new OnLongClickListener() { //  长按事件

			@Override
			public boolean onLongClick(View v) {
				ONLONGCLICKDOWN = 1;
				Log.e(TAG, "-----setOnLongClickListener--------------->>>");
				flag = false;
				MyThread m = new MyThread();//  启动删除字符的线程
				new Thread(m).start();//  启动删除字符的线程
				return false;
			}
		});


下面是删除字符的线程:

class MyThread implements Runnable {
		boolean nullf = false;
		public void run() {
			while(true){

				if(nullf){
					break;
				}
				if(flag){
					break;
				}
				try {
					Thread.sleep(100);
				} catch (Exception e) {
				}
				inputStr = removeLastStr(inputStr);
				if(inputStr == null){
					inputStr = "";
					nullf = true;
				}
				Message msg = new Message();
				Bundle b = new Bundle();// 存放数据
				b.putString("color", inputStr);
				b.putBoolean("turn", nullf); // true表示当前的输入框中的内容已经为空
				msg.setData(b);
				myHandler.sendMessage(msg); // 向Handler发送消息,更新UI
			}

		}
	}

接收消息并更新UI:

/**
	 * 接受消息,处理消息 ,此Handler会与当前主线程一块运行
	 * */
	class MyHandler extends Handler {
		public MyHandler() {
		}
		public MyHandler(Looper L) {
			super(L);
		}
		// 子类必须重写此方法,接受数据
		@Override
		public void handleMessage(Message msg) {
			super.handleMessage(msg);
			// 此处可以更新UI
			Bundle b = msg.getData();
			String color = b.getString("color");
			boolean turn = b.getBoolean("turn");
			if(turn){
				hideBtn();// 隐藏按钮
			}
			et.setText(color);// 设置输入框内容为空
		}
	}

在删除线程中有一个Thread.slleep(500);这个时间可能需要根据实际项目需求进行改动,如果过小会是程式占用过多的资源,过大则反应迟钝。目前只设定了一个觉得比较适合的时间点。



你可能感兴趣的:(Android,UI)