如何更改EditText的图标?以及替换密码EditText黑点为自定义Drawable?
解决EditText密码黑点替换与图标修改问题
嘿,这两个需求我都帮你捋清楚啦,分两部分给你讲:
一、把密码输入的黑点换成自定义Drawable
Android原生的密码遮罩是通过TransformationMethod实现的,我们需要自定义一个类来替换默认的黑点:
- 先创建自定义的密码转换类:
import android.content.Context; import android.graphics.Canvas; import android.graphics.drawable.Drawable; import android.text.method.PasswordTransformationMethod; import android.text.style.ReplacementSpan; import android.view.View; import android.widget.TextView; public class CustomPasswordTransformation extends PasswordTransformationMethod { private final Drawable customDrawable; private final int drawableSize; public CustomPasswordTransformation(Context context) { // 加载你的自定义Drawable资源 customDrawable = context.getResources().getDrawable(R.drawable.your_custom_password_dot); // 设置Drawable的尺寸(可根据需求调整) drawableSize = (int) context.getResources().getDimension(R.dimen.password_dot_size); customDrawable.setBounds(0, 0, drawableSize, drawableSize); } @Override public CharSequence getTransformation(CharSequence source, View view) { return new PasswordCharSequence(source); } private class PasswordCharSequence implements CharSequence { private final CharSequence source; public PasswordCharSequence(CharSequence source) { this.source = source; } @Override public char charAt(int index) { // 返回一个占位字符,实际会被我们的Drawable替换 return '•'; } @Override public int length() { return source.length(); } @Override public CharSequence subSequence(int start, int end) { return this.subSequence(start, end); } @Override public String toString() { return source.toString(); } } @Override public void onDraw(Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, TextView widget) { for (int i = start; i < end; i++) { // 绘制自定义Drawable到每个字符的位置 customDrawable.draw(canvas); // 移动画布到下一个位置,间距可自行调整 canvas.translate(drawableSize + widget.getPaint().getLetterSpacing(), 0); } } }
- 在代码中给EditText设置这个转换方法:
EditText passwordEt = findViewById(R.id.edittext_Password); passwordEt.setTransformationMethod(new CustomPasswordTransformation(this));
注意:记得把R.drawable.your_custom_password_dot换成你自己的Drawable资源,R.dimen.password_dot_size是你在 dimens.xml 中定义的尺寸值哦。
二、修改EditText的图标
这里分两种常见的图标场景:
1. 输入框的左侧/右侧常规图标(比如账号图标、提示图标)
- XML静态设置:直接在EditText标签里添加属性:
android:drawableLeft="@drawable/your_left_icon" <!-- 左侧图标 --> android:drawableRight="@drawable/your_right_icon" <!-- 右侧图标 --> android:drawablePadding="8dp" <!-- 图标与文字的间距 -->
- 代码动态修改:如果需要在运行时切换图标,用这个方法:
passwordEt.setCompoundDrawablesWithIntrinsicBounds( R.drawable.your_left_icon, // 左侧图标 null, // 顶部图标(不需要就传null) R.drawable.your_right_icon, // 右侧图标 null // 底部图标(不需要就传null) ); // 调整图标与文字的间距 passwordEt.setCompoundDrawablePadding(getResources().getDimensionPixelOffset(R.dimen.icon_padding));
2. 密码可见切换的图标(默认的眼睛图标)
如果你用的是Material Design的TextInputLayout(推荐,自带密码切换功能),可以直接在布局里替换切换图标:
<com.google.android.material.textfield.TextInputLayout android:layout_width="match_parent" android:layout_height="wrap_content" app:passwordToggleEnabled="true" app:passwordToggleDrawable="@drawable/your_custom_toggle_icon"> <EditText android:id="@+id/edittext_Password" android:layout_width="wrap_content" android:layout_height="wrap_content" android:backgroundTint="@color/colorPrimary" android:inputType="textPassword" android:layout_weight="1" /> </com.google.android.material.textfield.TextInputLayout>
这里的app:passwordToggleDrawable就是替换默认眼睛图标的属性,换成你的自定义Drawable即可。
如果是原生EditText想自定义切换图标,就得自己实现:比如在EditText右侧添加一个ImageView,监听点击事件来切换inputType(textPassword和textVisiblePassword),同时切换ImageView的图标。
内容的提问来源于stack exchange,提问作者Polaris Nation
相关产品推荐
相关产品推荐

