自定义EditText实现IP输入框

来源:互联网 发布:酷狗音乐mac版下载 编辑:程序博客网 时间:2024/05/20 06:51

你们听说过需要在Andrid设备上输入IP地址的需求吗,不管你们听说了没有,反正我是没听说。这不,产品提出了这么逆天的需求。

祖传的图,传男不传女。
这里写图片描述

为了点击键盘效果明显,特地下载一款这么风骚的皮肤。

先说下大致思路

  1. 继承LinearLayout
  2. 实现了多个EditText横向排列。
  3. 去掉每个EditText的背景
  4. Linearlayout中onDraw()方法绘制边框
  5. 为每个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
原创粉丝点击