ClearEditext

仿微信editext,右边有清楚文本的“x”的按钮,按钮会在失去焦点和文本为空的时候消失。思路很简单

https://github.com/yanchenko/droidparts/blob/develop/droidparts/src/org/droidparts/widget/ClearableEditText.java


/**
 * Copyright 2015 Alex Yanchenko
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *  
 *     http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License. 
 */
package org.droidparts.widget;

import static org.droidparts.util.Strings.isNotEmpty;

import org.droidparts.adapter.widget.TextWatcherAdapter;
import org.droidparts.adapter.widget.TextWatcherAdapter.TextWatcherListener;

import android.content.Context;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnFocusChangeListener;
import android.view.View.OnTouchListener;
import android.widget.EditText;

/**
 * To change clear icon, set
 * 
 * 
 * android:drawableRight="@drawable/custom_icon"
 * 
*/ public class ClearableEditText extends EditText implements OnTouchListener, OnFocusChangeListener, TextWatcherListener { public interface Listener { void didClearText(); } public void setListener(Listener listener) { this.listener = listener; } private Drawable xD; private Listener listener; public ClearableEditText(Context context) { super(context); init(); } public ClearableEditText(Context context, AttributeSet attrs) { super(context, attrs); init(); } public ClearableEditText(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(); } @Override public void setOnTouchListener(OnTouchListener l) { this.l = l; } @Override public void setOnFocusChangeListener(OnFocusChangeListener f) { this.f = f; } private OnTouchListener l; private OnFocusChangeListener f; @Override public boolean onTouch(View v, MotionEvent event) { if (getCompoundDrawables()[2] != null) { boolean tappedX = event.getX() > (getWidth() - getPaddingRight() - xD .getIntrinsicWidth()); if (tappedX) { if (event.getAction() == MotionEvent.ACTION_UP) { setText(""); if (listener != null) { listener.didClearText(); } } return true; } } if (l != null) { return l.onTouch(v, event); } return false; } @Override public void onFocusChange(View v, boolean hasFocus) { if (hasFocus) { setClearIconVisible(isNotEmpty(getText())); } else { setClearIconVisible(false); } if (f != null) { f.onFocusChange(v, hasFocus); } } @Override public void onTextChanged(EditText view, String text) { if (isFocused()) { setClearIconVisible(isNotEmpty(text)); } } private void init() { xD = getCompoundDrawables()[2]; if (xD == null) { xD = getResources() .getDrawable(android.R.drawable.presence_offline); } xD.setBounds(0, 0, xD.getIntrinsicWidth(), xD.getIntrinsicHeight()); setClearIconVisible(false); super.setOnTouchListener(this); super.setOnFocusChangeListener(this); addTextChangedListener(new TextWatcherAdapter(this, this)); } protected void setClearIconVisible(boolean visible) { boolean wasVisible = (getCompoundDrawables()[2] != null); if (visible != wasVisible) { Drawable x = visible ? xD : null; setCompoundDrawables(getCompoundDrawables()[0], getCompoundDrawables()[1], x, getCompoundDrawables()[3]); } } }






你可能感兴趣的:(ClearEditext)