android 自定义EditText 整合删除
来源:互联网 发布:python安装第三方库 编辑:程序博客网 时间:2024/06/01 18:56
前言
对常用组件进行封装可以使开发事半功倍,比如这篇介绍的带删除功能和字符串格式功能的EditText
思路:
对多个系统View 进行整合,将具有删除功能的img封装到EditText中,然后可以对字符进行格式化的功能以接口
形式对外暴露,具体实现给调用方。方便多项目移植并且达到功能上解耦。
效果图
如上图, 手机号码进行 344 分割,获取焦点后 删除img显示,失去光标则消失 删除img。看到这里是不是已经有自己封装方式了。
源码
package com.nuoyuan.xd.widget;import android.content.Context;import android.graphics.drawable.Drawable;import android.support.v4.content.ContextCompat;import android.support.v4.graphics.drawable.DrawableCompat;import android.support.v7.widget.AppCompatEditText;import android.text.Editable;import android.text.TextWatcher;import android.util.AttributeSet;import android.util.Log;import android.view.MotionEvent;import android.view.View;import com.nuoyuan.xd.R;/** * by weichyang 2017/10/13 14:52 * 1.自包含删除图标 * 2.规则定制 */public class NyCompatEditText extends AppCompatEditText implements View.OnFocusChangeListener, View.OnTouchListener, TextWatcher { /** * 关闭图片 */ private Drawable mClearTextIcon; /** * 焦点监听回调 */ private OnFocusChangeListener mOnFocusChangeListener; /** * 规则接口 */ private EditerRuler editerRuler; private OnTouchListener mOnTouchListener; private Context mContext; private Drawable dRight; public NyCompatEditText(Context context) { super(context); init(context); } public NyCompatEditText(Context context, AttributeSet attrs) { super(context, attrs); init(context); } public NyCompatEditText(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(context); } private void init(Context context) { this.mContext = context; mClearTextIcon = getCompoundDrawables()[2]; if (mClearTextIcon == null) { final Drawable drawable = ContextCompat.getDrawable(context, R.drawable.iconclose); final Drawable wrapDrawable = DrawableCompat.wrap(drawable); DrawableCompat.setTint(wrapDrawable, getCurrentHintTextColor()); mClearTextIcon = wrapDrawable; } mClearTextIcon.setBounds(0, 0, mClearTextIcon.getIntrinsicHeight(), mClearTextIcon.getIntrinsicHeight()); setClearIconVisible(false); super.setOnFocusChangeListener(this); super.setOnTouchListener(this); addTextChangedListener(this); } public void setmOnFocusChangeListener(OnFocusChangeListener mOnFocusChangeListener) { this.mOnFocusChangeListener = mOnFocusChangeListener; } public void setmOnTouchListener(OnTouchListener mOnTouchListener) { this.mOnTouchListener = mOnTouchListener; } public void addEditerRuler(EditerRuler editerRuler) { this.editerRuler = editerRuler; } private void setClearIconVisible(boolean visible) { mClearTextIcon.setVisible(visible, false); final Drawable[] compoundDrawables = getCompoundDrawables(); setCompoundDrawables( compoundDrawables[0], compoundDrawables[1], visible ? mClearTextIcon : null, compoundDrawables[3]); } @Override public void onFocusChange(View v, boolean hasFocus) { if (hasFocus) { setClearIconVisible(getText().length() > 0); } else { setClearIconVisible(false); } if (mOnFocusChangeListener != null) { mOnFocusChangeListener.onFocusChange(v, hasFocus); } } @Override public boolean onTouch(View v, MotionEvent motionEvent) { int x = (int) motionEvent.getX(); if (mClearTextIcon.isVisible() && x > getWidth() - getPaddingRight() - mClearTextIcon.getIntrinsicWidth()) { if (motionEvent.getAction() == motionEvent.ACTION_UP) { setError(null); setText(""); } return true; } return (mOnTouchListener != null && mOnTouchListener.onTouch(v, motionEvent)); } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { Log.d("beforeTextChanged", " s:" + s + " start:" + start + " count:" + count + " after:" + after); } @Override public void onTextChanged(CharSequence s, int start, int lengthBefore, int lengthAfter) { if (isFocused()) { setClearIconVisible(s.length() > 0); } if (s == null || s.length() == 0) return; if (editerRuler != null) { String[] afterRuler = editerRuler.runRulerForResult(s, start, lengthBefore); if (afterRuler != null && (afterRuler.length > 0 && afterRuler.length == 2)) { this.setText(afterRuler[0]); this.setSelection(afterRuler[1] == null ? 0 : Integer.valueOf(afterRuler[1])); } } } @Override public void afterTextChanged(Editable s) { }}
关键地方就是针对 光标处理,以及规则获取。这里以接口形式对外发布规则接口。
规则接口
/** * Created by weichyang on 2017/10/13. */public interface EditerRuler { /** * 外部设置edit规则 * @param s 设置string * @param start * @param lengthBefore */ String[] runRulerForResult(CharSequence s, int start, int lengthBefore);}
规则实现类
package com.nuoyuan.xd.widget;/** * Author: weichyang * Date: 2017/10/13 * Description: editer 规则实现类 * * 手机号码 * 身份证号码 */public class EditerRulerImpl implements EditerRuler { @Override public String[] runRulerForResult(CharSequence s, int start, int lengthBefore) { return getFormatPhoneNum(s,start,lengthBefore); } /** * 手机号码规则 * @param s * @param start * @param lengthBefore * @return */ private String[] getFormatPhoneNum(CharSequence s, int start, int lengthBefore){ //手机号格式化xxx xxxx xxxx String[] result= new String[2]; StringBuilder sb = new StringBuilder(); for (int i = 0; i < s.length(); i++) { if (i != 3 && i != 8 && s.charAt(i) == ' ') { continue; } else { sb.append(s.charAt(i)); if ((sb.length() == 4 || sb.length() == 9) && sb.charAt(sb.length() - 1) != ' ') { sb.insert(sb.length() - 1, ' '); } } } if (!sb.toString().equals(s.toString())) { int index = start + 1; if (sb.charAt(start) == ' ') { if (lengthBefore == 0) { index++; } else { index--; } } else { if (lengthBefore == 1) { index--; } } result[0]=sb.toString(); result[1]=String.valueOf(index); return result; } return null; }}
如上,所有规则定制,放入规则实现类。用到那个规则调用那个规则,这里这些了一个手机号码段分割规则。其他自行脑补。
调用地方
editPhoneNumber.addEditerRuler(new EditerRulerImpl());
直接将规则实现类,传进入。ok
阅读全文
0 0
- android 自定义EditText 整合删除
- Android EditText 自定义带删除按钮
- Android-EditText(自定义带删除功能的EditText)
- Android-EditText 自定义带删除功能的EditText
- Android-EditText(自定义带删除功能的EditText)
- android自定义View之自定义EditText(添加删除功能)
- Android自定义View之自定义EditText(添加删除功能)
- android自定义View之自定义EditText(添加删除功能)
- 自定义的删除edittext
- Android自定义View带有删除按钮的EditText
- android自定义控件(组合控件)--带删除按钮的EditText
- Android自定义View------带删除功能的EditText
- Android自定义右边带删除按钮的EditText
- android自定义多功能EditText 边框状态和删除内容
- Android自定义带删除按钮的输入框EditText
- Android自定义View-带删除和搜索图标的EditText
- 自定义带删除的 EditText
- Android 笔记:android自定义View之自定义EditText(添加删除功能)
- HTML-块级元素与行内元素(block-level & inline element)
- CentOS 6.5 yum安装MySQL5.6
- Vector 中elements功能
- 【笔记】Visual Studio 快捷键
- 10.20考试爆炸记
- android 自定义EditText 整合删除
- python 描述符类
- UVA
- SDUT-2673 3-4 计算长方形的周长和面积
- Anaconda安装Pyserial
- linux安装pyenv
- Linux发送get、post请求
- Android开发--Socket通讯解析
- 陪父母旅行,它让你的心意更全,因为有你在身旁