標籤:edittext android 帶刪除的edittext
我們經常在一些應用中見到輸入框帶有刪除功能,今天我們就來實現這個功能(文字組織能力不強,大家隨便看看)。主要是記錄一下自己的學習經曆,如果對大家有協助,我會更開心的。
先:
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/25/F4/wKiom1NoiWKxPyZ1AAF6K_ZbO_g941.jpg" title="EditTextWithDelete.png" alt="wKiom1NoiWKxPyZ1AAF6K_ZbO_g941.jpg" />
實現要點:
1、當輸入框為空白時,刪除按鈕隱藏;
2、當輸入框不為空白時,顯示刪除按鈕。
核心代碼:
package com.example.view;import com.example.ui.R;import android.content.Context;import android.graphics.Rect;import android.graphics.drawable.Drawable;import android.text.Editable;import android.text.TextWatcher;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;import android.widget.EditText;import android.widget.Toast;import android.view.View.OnFocusChangeListener;;public class EditTextWithDelete extends EditText implements OnFocusChangeListener{ private Drawable imgEnable; private Context context; public EditTextWithDelete(Context context) { super(context); this.context = context; init(); } public EditTextWithDelete(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); this.context = context; init(); } public EditTextWithDelete(Context context, AttributeSet attrs) { super(context, attrs); this.context = context; init(); } private void init() { //擷取圖片資源 imgEnable = context.getResources().getDrawable(R.drawable.delete); addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void afterTextChanged(Editable s) { setDrawable(); Toast.makeText(context, getText(), 10).show(); } }); setDrawable(); } /** * 設定刪除圖片 */ private void setDrawable() { if(length() == 0) { setCompoundDrawablesWithIntrinsicBounds(null, null, null, null); }else { setCompoundDrawablesWithIntrinsicBounds(null, null, imgEnable, null); } } /** * event.getX() 擷取相對應自身左上方的X座標 * event.getY() 擷取相對應自身左上方的Y座標 * getWidth() 擷取控制項的寬度 * getTotalPaddingRight() 擷取刪除表徵圖左邊緣到控制項右邊緣的距離 * getPaddingRight() 擷取刪除表徵圖右邊緣到控制項右邊緣的距離 * getWidth() - getTotalPaddingRight() 計算刪除表徵圖左邊緣到控制項左邊緣的距離 * getWidth() - getPaddingRight() 計算刪除表徵圖右邊緣到控制項左邊緣的距離 */ @Override public boolean onTouchEvent(MotionEvent event) { if(imgEnable != null && event.getAction() == MotionEvent.ACTION_UP) { int x = (int) event.getX() ; //判斷觸摸點是否在水平範圍內 boolean isInnerWidth = (x > (getWidth() - getTotalPaddingRight())) && (x < (getWidth() - getPaddingRight())); //擷取刪除表徵圖的邊界,返回一個Rect對象 Rect rect = imgEnable.getBounds(); //擷取刪除表徵圖的高度 int height = rect.height(); int y = (int) event.getY(); //計算表徵圖底部到控制項底部的距離 int distance = (getHeight() - height) /2; //判斷觸摸點是否在豎直範圍內(可能會有點誤差) //觸摸點的縱座標在distance到(distance+表徵圖自身的高度)之內,則視為點中刪除表徵圖 boolean isInnerHeight = (y > distance) && (y < (distance + height)); if(isInnerWidth && isInnerHeight) { setText(""); } } return super.onTouchEvent(event); } @Override protected void finalize() throws Throwable { super.finalize(); } @Override public void onFocusChange(View v, boolean hasFocus) { if(hasFocus) { setDrawable(); }else { setCompoundDrawablesWithIntrinsicBounds(null, null, null, null); } } }
代碼注釋很清楚,相信以大家的水平都會看的懂的。在這邊,我就不多做解釋了。如果有不明白的,可以給我留言,大家交流交流。
本文出自 “簡單的IT生活” 部落格,請務必保留此出處http://jychen.blog.51cto.com/4792328/1407209