1

I am using the DroidParts library for Clearable EditTexts (http://droidparts.org/widgets.html#clearableedittext). The question is how to keep the cross/clear button on the first line. I have no idea where to start looking so any help would be great! Thanks

Code is this:

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;

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();
    }

    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));
    }

    @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) {
            if (event.getAction() == MotionEvent.ACTION_UP) {
                boolean tappedX = event.getX() > (getWidth()
                        - getPaddingRight() - xD.getIntrinsicWidth());
                if (tappedX) {
                    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));
        }
    }

    protected void setClearIconVisible(boolean visible) {
        Drawable x = visible ? xD : null;
        setCompoundDrawables(getCompoundDrawables()[0],
                getCompoundDrawables()[1], x, getCompoundDrawables()[3]);
    }
}  

Is there another method that will have the same effect?

  • Do you want the icon to stay on the first line (instead of being centered like it's now)? Or make the ClearableEditText occupy only one line? – yanchenko Jul 02 '13 at 20:48
  • @yanchenko Make the icon stay on the first line - even when I have multiple lines. –  Jul 03 '13 at 05:56
  • Also @yanchenko Is there a way for the cross button to make a "click" sound as if were a normal button? –  Jul 03 '13 at 17:15
  • Doesn't seem like it's possible. You'll have to use a custom layout with EditText + clear icon. – yanchenko Jul 03 '13 at 20:55
  • @yanchenko Not possible for both the click sound and the button on first line? I can live without the click sound ;-) –  Jul 03 '13 at 21:03
  • Yes, not possible for both. – yanchenko Jul 04 '13 at 04:37
  • One last question @yanchenko Is is possibles to stop the vibration that occurs after pressing the x button. Its annoying as the vibration is delayed by a seconds or two –  Jul 04 '13 at 12:02
  • this implementation sadly does not work on Android 4.3 http://stackoverflow.com/questions/18383006/requestlayout-improperly-called-on-android-4-3 – androidu Aug 23 '13 at 07:16
  • 1
    @MarciCăşvan P.S. yankchenko is the guy who made droidparts so he might be able to help. –  Aug 23 '13 at 10:27

0 Answers0