EditText详解与自定义

 

一、常用属性设置
     1、文字过滤设置
        android:inputType="text" //软键盘为数字字母风格
        android:inputType="textAutoComplete" //自动完成
        android:inputType="textUri" //输入网址
        android:inputType="textEmailAddress"  //电子邮件地址
        android:inputType="textPassword"  //密码
        android:inputType="textVisiblePassword" //可见密码
        android:inputType="textFilter"  //文本筛选过滤
        android:inputType="textPhonetic" //拼音输入
        android:textColorHint  //设置提示hint信息的颜色。
        android:inputType="number"   //数字
        android:inputType="numberSigned"  //带符号数字格式
        android:inputType="numberDecimal"  //带小数点的浮点格式
        android:inputType="phone"  //拨号键盘
        android:typeface="monospace" //控制字间距normal, sans, serif, monospace
        android:password="true" //内容显示为星号
        android:numeric="true" //纯数字输入
        android:singleLine="true"  //强制输入的内容在单行
        android:ellipsize="end"  //自动隐藏尾部溢出数据,一般用于文字内容过长一行无法全部显示时
        android:maxLength="40" //输入字符的最大长度为40
    2、焦点设置
    //是否获自动取焦点
     setFocusable(boolean flag);
    //是否触摸获取焦点
     setFocusableInTouchMode(boolean flag);
    //申请焦点
     requestFocus();
    //清除焦点
     clearFocus();
    //窗口变化是否影响焦点
     onWindowFocusChanged(boolean flag);
    // 获得焦点时全选文本
     edittext.setSelectAllOnFocus(true);
    //焦点变化监听
     edittext.setOnFocusChangeListener(new android.view.View.OnFocusChangeListener() {
         @Override
         public void onFocusChange(View v, boolean hasFocus) {
             if (hasFocus) {
                 // 获得焦点
             } else {
                 // 失去焦点
             }
         }

     });

     3、光标设置
        //光标始终显示在文字左侧
         Editable etable = edittext.getText();
         Selection.setSelection(etable, etable.length());
        //光标的可见性和不可见性
         edittext.setCursorVisible(boolean flag);
        //设置光标的样式
         xml文件中设置: android:textCursorDrawable="@drawable/edit_text_shape"
         drawable/edit_text_shape如下:
         <?xml version="1.0" encoding="utf-8"?>
         <shape xmlns:android="http://schemas.android.com/apk/res/android">
             <size android:width="1.5dp" />
             <solid android:color="@android:color/darker_gray" />
         </shape>
     4、密码可见性设置
        //显示密码(三选一)
         edittext.setInputType(0x90);
         edittext.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
         edittext.ed_input.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
       //隐藏密码(三选一)
         edittext.setInputType(0x81);
         edittext.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);

         edittext.setTransformationMethod(PasswordTransformationMethod.getInstance());

     5、文字输入监听
         edittext.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                //edittext变化前
            }
    
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                //edittext变化时
            }
    
            @Override
            public void afterTextChanged(Editable s) {
                //变化后,s为变化后的长度
            }
         });

     6、软键盘设置
      //软键盘不弹出,手动调出
       在EditText的父级控件中找一个,设置成
       android:focusable="true"  
       android:focusableInTouchMode="true"
      //软键盘顶起父控件,调整布局。对应的acitivity设置
       android:windowSoftInputMode="adjustPan|stateHidden"
       各输入模式的值含义:
       stateUnspecified:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置
       stateUnchanged:当这个activity出现时,软键盘将一直保持在上一个activity里的状态,无论是隐藏还是显示
       stateHidden:用户选择activity时,软键盘总是被隐藏
       stateAlwaysHidden:当该Activity主窗口获取焦点时,软键盘也总是被隐藏的+
       stateVisible:软键盘通常是可见的
       stateAlwaysVisible:用户选择activity时,软键盘总是显示的状态
       adjustUnspecified:默认设置,通常由系统自行决定是隐藏还是显示
       adjustResize:该Activity总是调整屏幕的大小以便留出软键盘的空间
       adjustPan:当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分

二、自定义EditText

1、带有删除图标的EditText

public class ClearEditText extends EditText implements View.OnFocusChangeListener, TextWatcher {
    private Drawable mClearDrawable;
    private Context  context;

    /**
     * 控件是否有焦点
     */
    private boolean hasFocus;

    public ClearEditText(Context context) {
        this(context, null);
        this.context = context;
    }

    public ClearEditText(Context context, AttributeSet attrs) {
        // 这里构造方法也很重要,不加这个很多属性不能再XML里面定义
        this(context, attrs, android.R.attr.editTextStyle);
        this.context = context;
    }

    public ClearEditText(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        this.context = context;
        init();
    }

    private void init() {
        // 获取EditText的DrawableRight,假如没有设置我们就使用默认的图片
        mClearDrawable = getCompoundDrawables()[2];
        if (mClearDrawable == null) {
            mClearDrawable = getResources().getDrawable(R.drawable.icon_delete);
        }
        mClearDrawable.setBounds(-dp2px(10), 0, mClearDrawable.getIntrinsicWidth() - dp2px(10),
                mClearDrawable.getIntrinsicHeight());

        // 默认设置隐藏图标
        setClearIconVisible(false);
        // 设置焦点改变的监听
        setOnFocusChangeListener(this);
        // 设置输入框里面内容发生改变的监听
        addTextChangedListener(this);
        // 设置获取焦点时选中全部内容
        // setSelectAllOnFocus(true);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (mClearDrawable != null && event.getAction() == MotionEvent.ACTION_UP) {
            int x = (int) event.getX();
            // 判断触摸点是否在水平范围内
            boolean isInnerWidth = (x > (getWidth() - getTotalPaddingRight() - dp2px(10)))
                    && (x < (getWidth() - getPaddingRight() - dp2px(10)));
            // 获取删除图标的边界,返回一个Rect对象
            Rect rect = mClearDrawable.getBounds();
            // 获取删除图标的高度
            int height = rect.height();
            int y = (int) event.getY();
            // 计算图标底部到控件底部的距离
            int distance = (getHeight() - height) / 2;
            // 判断触摸点是否在竖直范围内(可能会有点误差)
            // 触摸点的纵坐标在distance到(distance+图标自身的高度)之内,则视为点中删除图标
            boolean isInnerHeight = true;// (y > distance) && (y < (distance +
            // height));
            if (isInnerHeight && isInnerWidth) {
                this.setText("");
            }
        }
        return super.onTouchEvent(event);
    }

    /**
     * 设置清除图标的显示与隐藏,调用setCompoundDrawables为EditText绘制上去
     * @param visible
     */
    public void setClearIconVisible(boolean visible) {
        Drawable right = visible ? mClearDrawable : null;
        setCompoundDrawables(getCompoundDrawables()[0], getCompoundDrawables()[1], right, getCompoundDrawables()[3]);
    }

    /**
     * 当ClearEditText焦点发生变化的时候,判断里面字符串长度设置清除图标的显示与隐藏
     */
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        this.hasFocus = hasFocus;
        if (hasFocus) {
            setClearIconVisible(getText().length() > 0);
        } else {
            setClearIconVisible(false);
        }
    }

    /**
     * 当输入框里面内容发生变化的时候回调的方法
     */
    @Override
    public void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) {
        if (hasFocus) {
            setClearIconVisible(text.length() > 0);
        }
    }

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

    }

    @Override
    public void afterTextChanged(Editable s) {

    }
    
    private int dp2px(int dp) {
        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, getResources().getDisplayMetrics());
    }

    /**
     * 输入框编辑状态
     */
    public void setEditable(boolean flag) {
        setFocusable(flag);
        setFocusableInTouchMode(flag);
    }
}

2、限制输入特殊字符的EditText

public class LimitEditText extends EditText {
    public LimitEditText(Context context) {
        super(context);
    }

    public LimitEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public LimitEditText(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    /**
     * 输入法
     * @param outAttrs
     * @return
     */
    @Override
    public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
        return new mInputConnecttion(super.onCreateInputConnection(outAttrs),
                false);
    }

    class mInputConnecttion extends InputConnectionWrapper implements
            InputConnection {

        public mInputConnecttion(InputConnection target, boolean mutable) {
            super(target, mutable);
        }

        /**
         * 对输入的内容进行拦截
         * @param text
         * @param newCursorPosition
         * @return
         */
        @Override
        public boolean commitText(CharSequence text, int newCursorPosition) {
            // 禁止特殊字符
            if (isConSpeCharacters(text.toString())) {
                return false;
            }
            return super.commitText(text, newCursorPosition);
        }

        @Override
        public boolean sendKeyEvent(KeyEvent event) {
            return super.sendKeyEvent(event);
        }

        @Override
        public boolean setSelection(int start, int end) {
            return super.setSelection(start, end);
        }

    }

    /**
     * 是否含有特殊字符
     */
    private boolean isConSpeCharacters(String string) {
        String regEx = "[`~!@#$%^&*+=|{}':;',\\[\\].<>/?~!@#¥%……&*()——+|{}【】‘;:”“’。,、?]";
        Pattern p = Pattern.compile(regEx);
        Matcher m = p.matcher(string);
        return m.find();
    }
}

 

 

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值