自定义EditText实现IP输入框
来源:互联网 发布:酷狗音乐mac版下载 编辑:程序博客网 时间:2024/05/20 06:51
你们听说过需要在Andrid设备上输入IP地址的需求吗,不管你们听说了没有,反正我是没听说。这不,产品提出了这么逆天的需求。
祖传的图,传男不传女。
为了点击键盘效果明显,特地下载一款这么风骚的皮肤。
先说下大致思路
- 继承LinearLayout
- 实现了多个EditText横向排列。
- 去掉每个EditText的背景
- Linearlayout中onDraw()方法绘制边框
- 为每个EditText添加输入监听
解说一下越到坑
1. LinearLayout的onDraw方法需要执行,需要添加下面代码
setDividerDrawable(getResources().getDrawable(android.R.drawable.divider_horizontal_textfield));
2. 每个EditText输入完毕,如何让下一个EditText选中,3. 当一个EditText删除完毕,如何让上一个EditText被选中4. **未解决的BUG,现在每个EditText的长度必须是3,才能完美的焦点切换**
下面贴一下代码
** * Created by xiongchengguang on 2016/12/22. */public class SuperEditText extends LinearLayout implements TextWatcher { private static final String TAG = "IPEditText"; private int width; private int height; private Paint paint; private static final int DEFAULT_TEXT_MAX_LENGTH = 3; private static final int DEFAULT_TEXT_SIZE = 16; private static final int DEFAULT_TEXT_COLOR = Color.BLACK; private static final int DEFAULT_BORDER_COLOR = Color.BLACK; private static final int DEFAULT_BORDER_WIDTH = 2; private static final int DEFAULT_POINT_COLOR = Color.BLACK; private static final int DEFAULT_POINT_WIDTH = 5; private static final int DEFAULT_IP_EDITTEXT_LENGTH = 4; private int textLength; private int textSize; private int textColor; private int borderColor; private int borderWidth; private int pointColor; private int pointWidth; private int editNumber; private int default_height = px2dp(20); private int default_width = px2dp(60); private List<EditText> data = new ArrayList<>(); public SuperEditText(Context context) { this(context, null); } public SuperEditText(Context context, AttributeSet attrs) { this(context, attrs, 0); } public SuperEditText(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.SuperEditText, defStyleAttr, 0); textLength = ta.getInt(R.styleable.SuperEditText_textLength, DEFAULT_TEXT_MAX_LENGTH); textSize = (int) ta.getDimension(R.styleable.SuperEditText_textSize, DEFAULT_TEXT_SIZE); textColor = ta.getColor(R.styleable.SuperEditText_textColor, DEFAULT_TEXT_COLOR); borderColor = ta.getColor(R.styleable.SuperEditText_borderColor, DEFAULT_BORDER_COLOR); borderWidth = (int) ta.getDimension(R.styleable.SuperEditText_borderWidth, DEFAULT_BORDER_WIDTH); pointColor = ta.getColor(R.styleable.SuperEditText_pointColor, DEFAULT_POINT_COLOR); pointWidth = (int) ta.getDimension(R.styleable.SuperEditText_pointWidth, DEFAULT_POINT_WIDTH); editNumber = ta.getInt(R.styleable.SuperEditText_editNumber, DEFAULT_IP_EDITTEXT_LENGTH); init(context); initPaint(); } public float getTextSize() { return data.get(0).getTextSize(); } private void initPaint() { paint = new Paint(); paint.setAntiAlias(true); paint.setStrokeWidth(2); paint.setStyle(Paint.Style.FILL); } private void init(Context context) { for (int i = 0; i < editNumber; i++) { EditText edit = new EditText(context); edit.setBackground(null); edit.setFilters(new InputFilter[]{new InputFilter.LengthFilter(textLength)}); edit.setTextSize(textSize); edit.setTextColor(textColor); edit.setGravity(Gravity.CENTER); edit.setInputType(InputType.TYPE_CLASS_NUMBER); edit.setMinHeight(default_height); edit.setMinWidth(default_width); edit.setTag(i); edit.setMaxLines(1); edit.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, 1)); edit.addTextChangedListener(this); addView(edit); data.add(edit); } setDividerDrawable(getResources().getDrawable(android.R.drawable.divider_horizontal_textfield)); setOrientation(LinearLayout.HORIZONTAL); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); int l = data.get(0).getLeft(); int t = data.get(0).getTop() - getPaddingTop(); int r = width - getPaddingRight(); int b = height; Rect rect = new Rect(l, t, r, b); paint.setColor(borderColor); paint.setStrokeWidth(borderWidth); paint.setStyle(Paint.Style.STROKE); canvas.drawRect(rect, paint); int y = height / 2; int x = width / editNumber; paint.setStrokeWidth(pointWidth); paint.setColor(pointColor); for (int i = 1; i < data.size(); i++) { canvas.drawPoint(x * i, y, paint); } } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); width = w; height = h; } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void afterTextChanged(Editable s) { if (listener != null) { listener.afterTextChanged(getSuperEditTextValue()); } if (s.length() == 3) { for (int i = 0; i < data.size(); i++) { EditText edit = data.get(i); String val = edit.getText().toString(); if (val.length() == 0) { edit.requestFocus(); return; } } } else if (s.length() == 0) { for (int i = data.size() - 1; i >= 0; i--) { EditText edit = data.get(i); edit.setFocusable(true); String val = edit.getText().toString(); if (val.length() == 3) { edit.requestFocus(); edit.setSelection(3); return; } } } } public String[] getSuperEditTextValue() { String[] val = new String[editNumber]; for (int i = 0; i < editNumber; i++) { val[i] = data.get(i).getText().toString(); KLog.d(data.get(i).getText().toString()); } return val; } public void setSuperEdittextValue(String[] s) { for (int i = 0; i < s.length; i++) { data.get(i).setText(s[i]); } } public boolean getSuperCompile() { for (int i = 0; i < editNumber; i++) { String str = data.get(i).getText().toString(); if (Integer.parseInt(str) <= 255) { return true; } } return false; } public int px2dp(int val) { return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, val, getResources().getDisplayMetrics()); } public int px2sp(int val) { return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, val, getResources().getDisplayMetrics()); } public interface SuperTextWatcher { public void afterTextChanged(String[] s); } private SuperTextWatcher listener; public void setSuperTextWatcher(SuperTextWatcher listener) { this.listener = listener; }}
自定义属性的
<?xml version="1.0" encoding="utf-8"?><resources> <declare-styleable name="SuperEditText"> <attr name="textLength" format="integer" /> <attr name="textSize" format="dimension" /> <attr name="textColor" format="color" /> <attr name="borderColor" format="color" /> <attr name="borderWidth" format="dimension" /> <attr name="pointColor" format="color" /> <attr name="pointWidth" format="dimension" /> <attr name="editNumber" format="integer" /> </declare-styleable></resources>
欢迎各位老司机前来带路
0 0
- 自定义EditText实现IP输入框
- 自定义EditText输入框
- 自定义TextWatcher:实现EditText输入字符限制
- 自定义仿PC端IP输入EditText控件
- 自定义textWatcher实现editText输入框的输入固定的字节数的目的
- Edittext实现密码输入框
- Android 自定义EditText输入框 带清空按钮
- 自定义android EditText输入框光标样式
- 自定义数字密码EditText输入框
- Android 自定义EditText输入框 带清空按钮
- Android自定义价格输入框EditText
- 仿微信充值金额输入框-自定义EditText
- 自定义Android Dialog EditText 密码输入框
- 自定义虚线格式的EditText输入框
- Android UI设计之<三>自定义EditText,实现带清除功能的输入框
- Android基础——自定义EditTExt实现去掉输入框添加下划线
- 自定义程序实现Android EditText只允许输入指定字符
- 自定义程序实现Android EditText只允许输入指定字符
- 小鼠迷宫问题
- 【Unity&Shader】关于变灰Shader的探究
- mvc单独ckfinder 图片上传
- Spring MVC之@RequestMapping 详解
- LINUX下FTP服务器搭建部署
- 自定义EditText实现IP输入框
- 一种多尺度的KCF跟踪程序代码分析(二)——图片视频转换和初始框输入
- jenkins 自动部署脚本 自动启停tomcat并部署项目
- lsof查看文件被什么进程占用
- mvc4源码调试“未能加载文件或程序集“System.Web.Mvc”或它的某一个依赖项。未能验证强名称签名。解决办法
- 点击图片,弹出层显示图片
- caffe笔记6——自定义layer
- 55 leetcode - N-Queens II
- Using kgdb, kdb and the kernel debugger internals