/** * Copyright 2014 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 eu.se_bastiaan.popcorntimeremote.widget; 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; import eu.se_bastiaan.popcorntimeremote.R; /** * To change clear icon, set * * <pre> * android:drawableRight="@drawable/custom_icon" * </pre> */ public class ClearableEditText extends EditText implements OnTouchListener, OnFocusChangeListener { public interface Listener { void didClearText(); } private Drawable xD; private Listener listener; private Boolean iconAlwaysVisible = false; private OnTouchListener l; private OnFocusChangeListener f; 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(); } public void setListener(Listener listener) { this.listener = listener; } public void setIconAlwaysVisible(Boolean iconAlwaysVisible) { this.iconAlwaysVisible = iconAlwaysVisible; if(iconAlwaysVisible) setClearIconVisible(true); } @Override public void setOnTouchListener(OnTouchListener l) { this.l = l; } @Override public void setOnFocusChangeListener(OnFocusChangeListener f) { this.f = 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 && !getText().toString().equals("") || iconAlwaysVisible) { setClearIconVisible(true); } else { setClearIconVisible(false); } if (f != null) { f.onFocusChange(v, hasFocus); } } @Override protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) { super.onTextChanged(text, start, lengthBefore, lengthAfter); if (isFocused() && !iconAlwaysVisible) { setClearIconVisible(!getText().toString().equals("")); } } private void init() { xD = getCompoundDrawables()[2]; if (xD == null) { xD = getResources() .getDrawable(R.drawable.abc_ic_clear_mtrl_alpha); } xD.setBounds(0, 0, xD.getIntrinsicWidth(), xD.getIntrinsicHeight()); setClearIconVisible(false); super.setOnTouchListener(this); super.setOnFocusChangeListener(this); } protected void setClearIconVisible(boolean visible) { Drawable x = visible ? xD : null; setCompoundDrawables(getCompoundDrawables()[0], getCompoundDrawables()[1], x, getCompoundDrawables()[3]); } }