关闭

自定义带有删除标签的edittext

标签: 自定义
120人阅读 评论(1) 收藏 举报
分类:

有的时候整个人都在纠结,为什么要写博客呢,写博客有什么意思,反正没人看,再说了,那么简单的东西,别人肯定会了,我干嘛还继续在这里唠叨呢。后来看了郭霖大神,巫山老妖等的博客,发现,技术都是小东西积累起来的,打好了基础,才能有更长远的发展。同时也是自己技术的一个总结和沉淀,技术就在日积月累中成长了。
今天分享一个简单的自定义,学会自己写带删除按钮的edittext。在这个自定一面,主要就是注意以下几个问题,就很容易写出来了:
1、edittext的焦点问题,获取焦点的情况下判断内容的长度来控制删除按钮的隐现。
2、edittext的ontouch区域判断,根据按下抬手的响应区域来做删除按钮的响应判断。
3、监听edittext变化中,变化后长度来控制删除按钮的显示问题。
具体的实现步骤我们看代码:

/**
 * Created by vincent on 2016/8/29.
 */
public class DeleteEditext extends EditText implements  TextWatcher, View.OnFocusChangeListener {
    private Drawable myDrawable;//删除图标
    private boolean hasFoucs = false;//是否获取焦点
    public DeleteEditext(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

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

    public DeleteEditext(Context context) {
        super(context);
        init();
    }

    private void init() {
        //getCompoundDrawables 4个属性,左上右下 0-4
        myDrawable = getCompoundDrawables()[2];
        if (myDrawable == null){
            myDrawable = getResources().getDrawable(R.mipmap.clean);
        }
        //设置图标的大小
        myDrawable.setBounds(0,0,myDrawable.getIntrinsicWidth(),myDrawable.getIntrinsicHeight());
        //设置图片是否可见
        setPicVisible(hasFoucs);//初始不可见

        setOnFocusChangeListener(this);//设置焦点获取

        addTextChangedListener(this);//设置字符长度监听
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_UP)//如果是松手
        {
            boolean isDelete=  (event.getX()>getWidth()-getTotalPaddingRight())&&(event.getX()<getWidth()-getPaddingRight());
            if (isDelete){
                setText("");
            }
        }
        return super.onTouchEvent(event);
    }

    private void setPicVisible(boolean hasFoucs) {
       Drawable drawable = hasFoucs?myDrawable:null;
        setCompoundDrawables(getCompoundDrawables()[0],getCompoundDrawables()[1],drawable,getCompoundDrawables()[3]);
    }


    @Override
    public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

    }

    @Override
    public void afterTextChanged(Editable editable) {
        boolean isVisible = getText().toString().length()>0;
        setPicVisible(isVisible);
    }

    @Override
    public void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) {
      setPicVisible(text.length()>0);
    }

    @Override
    public void onFocusChange(View view, boolean b) {
        hasFoucs = b;
        if (hasFoucs){
            setPicVisible(getText().length()>0);
        }else {
            setPicVisible(false);
        }
    }
}

代码很简单,不到100行,这也是简单的自定义,所以以后在自定义中,掌握好ontouch的使用,以及对控件大小的判断和位置获取,实现起来还是比较容易的。

1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1473次
    • 积分:50
    • 等级:
    • 排名:千里之外
    • 原创:3篇
    • 转载:0篇
    • 译文:0篇
    • 评论:4条
    文章分类
    文章存档
    最新评论