美文网首页
Android仿Windows的IP编辑输入框

Android仿Windows的IP编辑输入框

作者: 萝卜小青菜丶 | 来源:发表于2020-03-04 21:18 被阅读0次

分享一个仿Windows的IP编辑输入框

package com.test.view;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import androidx.annotation.Nullable;
import android.text.Editable;
import android.text.InputFilter;
import android.text.InputType;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.Toast;

public class IPEditTextView extends LinearLayout implements TextWatcher, View.OnTouchListener, View.OnKeyListener {

    private EditText[] editTexts = new EditText[4];
    private int tag;
    private Context mContext;
    private Paint paint;

    public IPEditTextView(Context context) {
        super(context);
        setWillNotDraw(false);
        this.mContext = context;
        init();
    }

    public IPEditTextView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        setWillNotDraw(false);
        this.mContext = context;
        init();
    }

    public IPEditTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        setWillNotDraw(false);
        this.mContext = context;
        init();
    }


    private void init() {

        for (int i = 0; i < 4; i++) {
            editTexts[i] = createEdit(mContext, i);
            this.addView(editTexts[i]);
        }
    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {

    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {

        if (TextUtils.isEmpty(s)) return;

        if(s.toString().length() > 3 || Integer.parseInt(s.toString().trim()) > 255) {
            Toast.makeText(mContext,"最大值为255",Toast.LENGTH_SHORT).show();
            editTexts[tag].setText("");
            return;
        }

        if(s.toString().length() == 3) {
            tag++;
            if(tag >= editTexts.length) tag = editTexts.length - 1;
            editTexts[tag].setFocusable(true);
            editTexts[tag].requestFocus();
        }
    }

    @Override
    public void afterTextChanged(Editable s) {

    }


    /**
     * 创建EditText
     * @param context
     * @param tag
     * @return
     */
    private EditText createEdit(Context context, int tag) {

        EditText editText = new EditText(context);
        LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(150, 50);
        editText.setLayoutParams(layoutParams);
        editText.setGravity(Gravity.CENTER);
        editText.setMaxLines(1);
        editText.setTag(tag);
        editText.setInputType(InputType.TYPE_CLASS_NUMBER);
        editText.setBackground(null);
        editText.addTextChangedListener(this);
        editText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(3)});
        editText.setOnTouchListener(this);
        editText.setOnKeyListener(this);
        return editText;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        paint = new Paint();
        paint.setColor(Color.BLACK);
        paint.setAntiAlias(true);

        //draw " . "
        for (int i = 0; i < editTexts.length - 1; i++) {
            canvas.drawCircle(editTexts[i].getMeasuredWidth() * (i + 1),getHeight() - 3,3,paint);
        }
        //draw 框
        paint.setStyle(Paint.Style.STROKE);
        canvas.drawRect(0,0,getWidth(),getHeight(),paint);
    }

    /**
     * editText 触摸事件
     * @param v        editText
     * @param event    事件类型
     * @return         是否处理
     */
    @Override
    public boolean onTouch(View v, MotionEvent event) {

        if(event.getAction() == MotionEvent.ACTION_UP) {
            tag = (int) v.getTag();
        }
        return false;
    }

    /**
     * IP Text
     * @return 新设置的IP
     */
    public String getText() {
        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < editTexts.length; i++) {
            if(editTexts[i] == null) {
                builder.append("0").append(".");
                continue;
            }
            String data = editTexts[i].getText().toString();
            builder.append(TextUtils.isEmpty(data) ? "0" : Integer.parseInt(data));
            if(i == (editTexts.length - 1)) continue;
            builder.append(".");
        }
        return builder.toString();
    }

    /**
     * 设置缓存IP
     * @param text
     */
    public void setText(String text) {
        if(TextUtils.isEmpty(text))return;
        String[] split = null;
        if (!text.contains(".")) return;
        split = text.split("\\.");
        int length = Math.min(split.length, editTexts.length);
        for (int i = 0; i < length; i++) {
            editTexts[i].setText(split[i] == null ? "0" : split[i].toString());
            editTexts[i].setSelection(split[i].length());
        }
    }


    /**
     * 软键盘删除键监听
     * @param v
     * @param keyCode
     * @param event
     * @return
     */
    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        if(keyCode == KeyEvent.KEYCODE_DEL && event.getAction() == KeyEvent.ACTION_UP) {
            if (tag < editTexts.length) {
                editTexts[tag].setFocusable(true);
                editTexts[tag].requestFocus();
            }
            if(TextUtils.isEmpty(editTexts[tag].getText().toString()) && tag > 0) tag--;
        }
        return false;
    }
}

相关文章

网友评论

      本文标题:Android仿Windows的IP编辑输入框

      本文链接:https://www.haomeiwen.com/subject/nswqictx.html