自定义的Android EditText
这是一个指定EditText,在我们的实际开发中,可以直接拿来用就行了,先上图看效果:
简单介绍下:当文本框有字符串时,在右边会显示一个清除的图标。点击清除的图标可以清除文本框的内容。
先上自定义编辑框代码:代码比较简单,值得注意的是onTouchEvent方法。这个是一个触摸事件,主要捕获清除图标,模拟点击事件。
1 package cn.datian.customedit; 2 3 import android.content.Context; 4 import android.graphics.drawable.Drawable; 5 import android.text.Editable; 6 import android.text.TextWatcher; 7 import android.util.AttributeSet; 8 import android.view.MotionEvent; 9 import android.view.View; 10 import android.view.View.OnFocusChangeListener; 11 import android.view.animation.Animation; 12 import android.view.animation.CycleInterpolator; 13 import android.view.animation.TranslateAnimation; 14 import android.widget.EditText; 15 16 public class ClearEditText extends EditText implements OnFocusChangeListener, TextWatcher { 17 /** 18 * 删除按钮的引用 19 */ 20 private Drawable mClearDrawable; 21 22 /** 23 * 控件是否有焦点 24 */ 25 private boolean hasFoucs; 26 27 public ClearEditText(Context context) { 28 this(context, null); 29 } 30 31 public ClearEditText(Context context, AttributeSet attrs) { 32 // 这里构造方法也很重要,不加这个很多属性不能再XML里面定义 33 this(context, attrs, android.R.attr.editTextStyle); 34 } 35 36 public ClearEditText(Context context, AttributeSet attrs, int defStyle) { 37 super(context, attrs, defStyle); 38 init(); 39 } 40 41 private void init() { 42 // 获取EditText的DrawableRight,假如没有设置我们就使用默认的图片 43 mClearDrawable = getCompoundDrawables()[2]; 44 if (mClearDrawable == null) { 45 mClearDrawable = getResources().getDrawable(R.drawable.delete_selector); 46 } 47 mClearDrawable.setBounds(0, 0, mClearDrawable.getIntrinsicWidth(), 48 mClearDrawable.getIntrinsicHeight()); 49 // 默认设置隐藏图标 50 setClearIconVisible(false); 51 // 设置焦点改变的监听 52 setOnFocusChangeListener(this); 53 // 设置输入框里面内容发生改变的监听 54 addTextChangedListener(this); 55 } 56 57 /** 58 * 触摸事件,此方法的目的是给清除图标一个触摸事件(模拟点击事件),当触摸到清除图片的位置时,清除编辑框里面的内容 59 * 捕获清除图标位置的代码:event.getX() > (getWidth() - getTotalPaddingRight()) 60 * && (event.getX() < ((getWidth() - getPaddingRight()))) 61 * 返回true表示触摸到清除图标,清除编辑框里面的内容,返回false则不处理。 62 */ 63 @Override 64 public boolean onTouchEvent(MotionEvent event) { 65 if (event.getAction() == MotionEvent.ACTION_UP) { 66 if (getCompoundDrawables()[2] != null) { 67 68 boolean touchable = event.getX() > (getWidth() - getTotalPaddingRight()) 69 && (event.getX() < ((getWidth() - getPaddingRight()))); 70 71 int r= getTotalPaddingRight(); 72 int r2 = getPaddingRight(); 73 if (touchable) { 74 this.setText(""); 75 } 76 } 77 } 78 79 return super.onTouchEvent(event); 80 } 81 82 /** 83 * 当ClearEditText焦点发生变化的时候,判断里面字符串长度设置清除图标的显示与隐藏 84 */ 85 @Override 86 public void onFocusChange(View v, boolean hasFocus) { 87 this.hasFoucs = hasFocus; 88 if (hasFocus) { 89 setClearIconVisible(getText().length() > 0); 90 } else { 91 setClearIconVisible(false); 92 } 93 } 94 95 /** 96 * 设置清除图标的显示与隐藏,调用setCompoundDrawables为EditText绘制上去 97 * 98 * @param visible 99 */ 100 protected void setClearIconVisible(boolean visible) { 101 Drawable right = visible ? mClearDrawable : null; 102 Drawable[] mDrawables = getCompoundDrawables(); 103 setCompoundDrawables(mDrawables[0], mDrawables[1], right, 104 mDrawables[3]); 105 } 106 107 /** 108 * 当输入框里面内容发生变化的时候回调的方法 109 */ 110 @Override 111 public void onTextChanged(CharSequence s, int start, int count, int after) { 112 if (hasFoucs) { 113 setClearIconVisible(s.length() > 0); 114 } 115 } 116 117 /** 118 * 当输入框里面内容发生变化之前回调的方法 119 */ 120 @Override 121 public void beforeTextChanged(CharSequence s, int start, int count, int after) { 122 123 } 124 125 /** 126 * 当输入框里面内容发生变化之后回调的方法 127 */ 128 @Override 129 public void afterTextChanged(Editable s) { 130 131 } 132 133 /** 134 * 设置晃动动画 135 */ 136 public void setShakeAnimation() { 137 this.setAnimation(shakeAnimation(5,300)); 138 } 139 140 /** 141 * 晃动动画 142 * @param counts 晃动次数 143 * @param duration 晃动持续时间(毫秒) 144 * @return 145 */ 146 private Animation shakeAnimation(int counts,int duration) { 147 Animation translateAnimation = new TranslateAnimation(-1, 1, -1, 1); 148 translateAnimation.setInterpolator(new CycleInterpolator(counts)); 149 translateAnimation.setDuration(duration); 150 return translateAnimation; 151 } 152 }
布局XML代码:
1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 tools:context=".MainActivity" 6 android:orientation="vertical" 7 > 8 <cn.datian.customedit.ClearEditText 9 android:id="@+id/et" 10 android:layout_width="match_parent" 11 android:layout_height="wrap_content" 12 android:background="@drawable/login_edittext_bg" 13 android:drawableRight="@drawable/delete_selector" 14 android:singleLine="true" 15 /> 16 <Button 17 android:id="@+id/button1" 18 android:layout_width="wrap_content" 19 android:layout_height="wrap_content" 20 android:text="Button" /> 21 22 </LinearLayout>
delete_selector和login_edittext_bg是选择器:代码如下
delete_selector选择器代码:
1 <?xml version="1.0" encoding="utf-8"?> 2 <selector 3 xmlns:android="http://schemas.android.com/apk/res/android"> 4 <item android:state_pressed="true" android:drawable="@drawable/search_clear_pressed" /> 5 <item android:drawable="@drawable/search_clear_normal" /> 6 </selector>
login_edittext_bg选择器代码:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <selector xmlns:android="http://schemas.android.com/apk/res/android"> 3 <item android:state_focused="true" android:drawable="@drawable/login_edit_pressed"></item> 4 <item android:state_pressed="true" android:drawable="@drawable/login_edit_pressed"></item> 5 <item android:drawable="@drawable/login_edit_normal"></item> 6 </selector>
Activity代码:
1 package cn.datian.customedit; 2 3 import android.os.Bundle; 4 import android.app.Activity; 5 import android.view.View; 6 import android.widget.Button; 7 import android.widget.Toast; 8 9 public class MainActivity extends Activity { 10 11 private ClearEditText et; 12 @Override 13 protected void onCreate(Bundle savedInstanceState) { 14 super.onCreate(savedInstanceState); 15 setContentView(R.layout.activity_main); 16 17 Button btnLogin = (Button)this.findViewById(R.id.button1); 18 et = (ClearEditText)this.findViewById(R.id.et); 19 20 btnLogin.setOnClickListener(new View.OnClickListener() { 21 22 @Override 23 public void onClick(View v) { 24 String etStr = et.getText().toString(); 25 if(etStr.equals("") || etStr==null){ 26 //如果编辑框为空的话,抖动提示 27 et.setShakeAnimation(); 28 Toast.makeText(MainActivity.this, "不能为空", Toast.LENGTH_SHORT).show(); 29 } 30 } 31 }); 32 } 33 }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。