自定义带清除功能的EditText

摘要

  • 无论是带清除功能还是可以切换明文/密文的EditText,核心就是判断用户点击的位置是否在清除(切换)的图标位置,然后做出相应的设置就可以了。上效果图:

带清除功能的EditText

思路

  • 使用EditText自带的DrawableRight属性来设置删除图片;
  • 判断点击位置在右侧的图片范围时重置EditText的内容;
  • 使用TextWatcher观察EdiText没有text内容的时候隐藏删除图标,有内容则显示。

如何判断点击的位置

  • 重写OnTouchEvent方法
  • 要判断点击的是右侧的删除图片需要满足2个条件(忽略Y轴方向)
    1. 点击位置的event.getX()要大于EditText自身宽度减去paddingRight和DrawPadding;
      event.getX() > getWidth() - drawableRight.getIntrinsicWidth() - getPaddingRight();
    2. 点击位置的event.getX()要小于EditText自身宽度减去paddingRight.
      event.getX() < getWidth() - getPaddingRight();

完整代码:

public class ClearEditText extends AppCompatEditText implements TextWatcher {

public static final String TAG = "ClearEditText";
boolean isShow = false;//是否已经显示右侧删除图标

public ClearEditText(Context context) {
    this(context, null);
}

public ClearEditText(Context context, AttributeSet attrs) {
    this(context, attrs, 0);
}

public ClearEditText(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    Drawable drawableRight = this.getCompoundDrawables()[2];
    if (drawableRight != null) {//有右边图标才去相应点击事件
        int action = event.getAction();
        if (action == MotionEvent.ACTION_UP) {
            boolean xFlag1 = event.getX() > getWidth() - drawableRight.getIntrinsicWidth() - getPaddingRight();
            boolean xFlag2 = event.getX() < getWidth() - getPaddingRight();
            if (xFlag1 && xFlag2) {
                setText("");
            }
        }
    }
    return super.onTouchEvent(event);
}

@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {

}

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
    if (TextUtils.isEmpty(s)) {
        if (isShow) {
            isShow = !isShow;
            this.setCompoundDrawables(null, null, null, null);
        }
    } else {
        if (!isShow) {
            isShow = !isShow;
            Drawable drawable = this.getResources().getDrawable(R.drawable.right_delete);
            drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
            this.setCompoundDrawables(null, null, drawable, null);
        }
    }
}

@Override
public void afterTextChanged(Editable s) {

}
}

使用步骤:

 <com.csdnl.www.clearedittext.ClearEditText
    android:id="@+id/clearEditText"
    android:layout_width="300dp"
    android:layout_height="40dp"
    android:background="#ff0000"
    android:drawablePadding="10dp"
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:gravity="center_vertical"
    android:hint="请输入用户名"
    android:paddingRight="20dp"
    android:textColor="#fff"
    android:textColorHint="#fff"/>

Github地址,可直接依赖

如果让你做一个可切换明文和密文的EditText你是否也会了呢?如在使用种遇到问题,欢迎指出,共同交流。谢谢!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个有删除按钮的EditText的代码示例: ```xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content"> <EditText android:id="@+id/editText" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="10dp" android:background="@drawable/edittext_bg" android:hint="请输入内容" android:padding="10dp" android:textColor="@android:color/black" android:textColorHint="@android:color/darker_gray" android:textSize="16sp" /> <ImageView android:id="@+id/deleteButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentEnd="true" android:layout_centerVertical="true" android:layout_marginEnd="20dp" android:src="@drawable/ic_delete" /> </RelativeLayout> ``` 在这个示例中,我们使用了一个RelativeLayout来包含一个EditText和一个ImageView。EditText用于输入文本,ImageView用于删除文本。我们在EditText的背景中使用了一个自定义drawable,以便更好地区分EditText和其他视图。 接下来,我们需要在Java代码中为删除按钮添加一个点击事件,以便在用户点击按钮时清除EditText中的文本。以下是示例代码: ```java EditText editText = findViewById(R.id.editText); ImageView deleteButton = findViewById(R.id.deleteButton); deleteButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { editText.setText(""); } }); ``` 在这个示例中,我们使用findViewById方法获取EditText和ImageView的引用,并为ImageView添加了一个点击事件。在点击事件中,我们使用setText方法将EditText中的文本设置为空字符串,以便清除文本。 希望这个示例能够帮助你实现一个有删除按钮的EditText
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值