You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何更改EditText的图标?以及替换密码EditText黑点为自定义Drawable?

解决EditText密码黑点替换与图标修改问题

嘿,这两个需求我都帮你捋清楚啦,分两部分给你讲:

一、把密码输入的黑点换成自定义Drawable

Android原生的密码遮罩是通过TransformationMethod实现的,我们需要自定义一个类来替换默认的黑点:

  1. 先创建自定义的密码转换类:
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);
        }
    }
}
  1. 在代码中给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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:38:14