android 自定义EditText 整合删除
2017-10-20 18:17
543 查看
前言
对常用组件进行封装可以使开发事半功倍,比如这篇介绍的带删除功能和字符串格式功能的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
相关文章推荐
- Android自定义View-带删除和搜索图标的EditText
- Android EditText 自定义带删除按钮
- Android自定义View示例(一)—带有删除按钮的EditText
- Android自定义View示例(一)—带有删除按钮的EditText
- Android自定义View------带删除功能的EditText
- Android-EditText(自定义带删除功能的EditText)
- Android自定义带删除按钮的输入框EditText
- Android-EditText(自定义带删除功能的EditText)
- android自定义带删除按钮的EditText
- Android自定义View示例(一)—带有删除按钮的EditText
- Android自定义右边带删除按钮的EditText
- Android-EditText 自定义带删除功能的EditText
- android自定义多功能EditText 边框状态和删除内容
- Android demo-->自定义能实现一键删除功能的EditText
- Android自定义具有清除输入的EditText
- Android 在ViewPager中使用的可以画线,放大,保存,点击删除线条的自定义图片显示控件
- android activitygroup中edittext文本无法删除
- android安卓屏蔽禁用系统输入法,自定义软键盘,解决EditText光标问题demo
- Android基础控件——EditText的自定义、高仿iOS的UITextField
- androidUI设计之旅 ----自定义EditText(多了一个清除按钮)