Java tutorial
/** * Copyright 2015 Alex Yanchenko * <p/> * 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 * <p/> * http://www.apache.org/licenses/LICENSE-2.0 * <p/> * 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 de.struckmeierfliesen.ds.wochenbericht; import android.content.Context; import android.graphics.drawable.Drawable; import android.support.v4.content.ContextCompat; 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.AutoCompleteTextView; import android.widget.EditText; import static de.struckmeierfliesen.ds.wochenbericht.ClearableEditText.TextClearListener; import static org.apache.commons.lang3.StringUtils.isNotEmpty; /** * To change clear icon, set * * <pre> * android:drawableRight="@drawable/custom_icon" * </pre> */ public class ClearableAutoCompleteTextView extends AutoCompleteTextView implements OnTouchListener, OnFocusChangeListener, TextWatcherAdapter.TextWatcherListener { public void setTextClearListener(TextClearListener textClearListener) { this.textClearListener = textClearListener; } private Drawable xD; private TextClearListener textClearListener; private static double DRAWABLE_MULTIPLIER = 1; public ClearableAutoCompleteTextView(Context context) { super(context); init(); } public ClearableAutoCompleteTextView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public ClearableAutoCompleteTextView(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() - (int) (xD.getIntrinsicWidth() * DRAWABLE_MULTIPLIER)); if (tappedX) { if (event.getAction() == MotionEvent.ACTION_UP) { setText(""); if (textClearListener != null) { textClearListener.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 = ContextCompat.getDrawable(getContext(), R.drawable.ic_clear_black_24dp);//android.R.drawable.presence_offline); } xD.setBounds(0, 0, (int) (xD.getIntrinsicWidth() * DRAWABLE_MULTIPLIER), (int) (xD.getIntrinsicHeight() * DRAWABLE_MULTIPLIER)); 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]); } } }