Android自定义View之自定义EditText(添加删除功能)

       忙忙碌碌20天,新的项目终于接近尾声了。今天公司召集几个用户体验师和美工一起吐糟这20天做的这个新产品,对于产品提出了很多建议,这几天就改界面了。在这个项目中大量的使用了EditText组件,并且添加了删除功能。这里面都是用RelativeLayout布局将一个包含删除图片的ImageView放到EditText中的右边。然后对ImageView添加事件,进行删除。以前都是这样干的,相信大多数也是这样干的。可是今天用户体验师提出要求在EditText在没有内容的时候删除图片显示为灰色,有内容的时候显示为项目的主题色。靠,项目中用了40多个,要改死我。不过也怪自己在项目开始时没考虑到EditText的复用。

         为了更高的复用和减少代码的冗余所以按照用户体验师的要求自定义了一个EditText。

         EditTextWithDel组件的功能如下:

        1、在没用内容的时候显示不可用的图片状态,在有内容的时候显示可用的图片状态;

        2、在有内容的时候点击删除按钮可以删除EditText中的内容;

组件的代码如下:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package com.sunday.customs;  
  2.   
  3.   
  4. import com.example.customs.R;  
  5.   
  6. import android.content.Context;  
  7. import android.graphics.Rect;  
  8. import android.graphics.drawable.Drawable;  
  9. import android.text.Editable;  
  10. import android.text.TextWatcher;  
  11. import android.util.AttributeSet;  
  12. import android.util.Log;  
  13. import android.view.MotionEvent;  
  14. import android.widget.EditText;  
  15.   
  16. /** 
  17.  * @author sunday 
  18.  * 2013-12-04 
  19.  */  
  20. public class EditTextWithDel extends EditText {  
  21.     private final static String TAG = "EditTextWithDel";  
  22.     private Drawable imgInable;  
  23.     private Drawable imgAble;  
  24.     private Context mContext;  
  25.   
  26.     public EditTextWithDel(Context context) {  
  27.         super(context);  
  28.         mContext = context;  
  29.         init();  
  30.     }  
  31.   
  32.     public EditTextWithDel(Context context, AttributeSet attrs, int defStyle) {  
  33.         super(context, attrs, defStyle);  
  34.         mContext = context;  
  35.         init();  
  36.     }  
  37.   
  38.     public EditTextWithDel(Context context, AttributeSet attrs) {  
  39.         super(context, attrs);  
  40.         mContext = context;  
  41.         init();  
  42.     }  
  43.       
  44.     private void init() {  
  45.         imgInable = mContext.getResources().getDrawable(R.drawable.delete_gray);  
  46.         imgAble = mContext.getResources().getDrawable(R.drawable.delete);  
  47.         addTextChangedListener(new TextWatcher() {  
  48.             @Override  
  49.             public void onTextChanged(CharSequence s, int start, int before, int count) {}  
  50.             @Override  
  51.             public void beforeTextChanged(CharSequence s, int start, int count, int after) {}  
  52.             @Override  
  53.             public void afterTextChanged(Editable s) {  
  54.                 setDrawable();  
  55.             }  
  56.         });  
  57.         setDrawable();  
  58.     }  
  59.       
  60.     //设置删除图片  
  61.     private void setDrawable() {  
  62.         if(length() < 1)  
  63.             setCompoundDrawablesWithIntrinsicBounds(nullnull, imgInable, null);  
  64.         else  
  65.             setCompoundDrawablesWithIntrinsicBounds(nullnull, imgAble, null);  
  66.     }  
  67.       
  68.      // 处理删除事件  
  69.     @Override  
  70.     public boolean onTouchEvent(MotionEvent event) {  
  71.         if (imgAble != null && event.getAction() == MotionEvent.ACTION_UP) {  
  72.             int eventX = (int) event.getRawX();  
  73.             int eventY = (int) event.getRawY();  
  74.             Log.e(TAG, "eventX = " + eventX + "; eventY = " + eventY);  
  75.             Rect rect = new Rect();  
  76.             getGlobalVisibleRect(rect);  
  77.             rect.left = rect.right - 50;  
  78.             if(rect.contains(eventX, eventY))   
  79.                 setText("");  
  80.         }  
  81.         return super.onTouchEvent(event);  
  82.     }  
  83.   
  84.     @Override  
  85.     protected void finalize() throws Throwable {  
  86.         super.finalize();  
  87.     }  
  88.   
  89. }  

效果图如下:

 

demo:http://download.csdn.net/detail/ff20081528/6657423

 

转载请说明出处:http://blog.csdn.net/ff20081528/article/details/17121911

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值