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

如何在不使用TextInputEditText的情况下实现密码切换功能?

当然可以实现!完全不用依赖TextInputEditText或者TextInputLayout,用普通的EditText就能搞定密码显示切换功能,还能保持控件的原生高度,不会有多余的粗边或者动画。下面是具体的实现步骤:

1. 布局文件配置

用一个布局容器(比如RelativeLayout或ConstraintLayout)把普通EditText和眼睛图标按钮组合在一起,让按钮悬浮在输入框右侧内部:

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <EditText
        android:id="@+id/et_password"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="textPassword"
        android:paddingEnd="60dp" /> <!-- 给眼睛按钮预留空间,避免输入内容被遮挡 -->

    <ImageView
        android:id="@+id/iv_toggle_password"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentEnd="true"
        android:layout_centerVertical="true"
        android:padding="12dp"
        android:src="@drawable/ic_eye_closed" /> <!-- 初始显示闭眼图标 -->
</RelativeLayout>

2. 代码逻辑实现

在Activity/Fragment中给眼睛按钮添加点击事件,切换密码的可见状态,同时更新图标:

Kotlin 版本

val etPassword = findViewById<EditText>(R.id.et_password)
val ivTogglePassword = findViewById<ImageView>(R.id.iv_toggle_password)

var isPasswordVisible = false

ivTogglePassword.setOnClickListener {
    isPasswordVisible = !isPasswordVisible
    // 切换输入类型和图标
    if (isPasswordVisible) {
        etPassword.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD
        ivTogglePassword.setImageResource(R.drawable.ic_eye_open)
    } else {
        etPassword.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD
        ivTogglePassword.setImageResource(R.drawable.ic_eye_closed)
    }
    // 保持光标在文本末尾,提升体验
    etPassword.setSelection(etPassword.text.length)
}

Java 版本

EditText etPassword = findViewById(R.id.et_password);
ImageView ivTogglePassword = findViewById(R.id.iv_toggle_password);

boolean isPasswordVisible = false;

ivTogglePassword.setOnClickListener(v -> {
    isPasswordVisible = !isPasswordVisible;
    if (isPasswordVisible) {
        etPassword.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
        ivTogglePassword.setImageResource(R.drawable.ic_eye_open);
    } else {
        etPassword.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
        ivTogglePassword.setImageResource(R.drawable.ic_eye_closed);
    }
    // 光标移至末尾,避免切换后光标跳转
    etPassword.setSelection(etPassword.getText().length());
});

额外小贴士

  • 图标可以使用Material Design官方的ic_eye和ic_eye_off图标,确保适配不同系统主题;
  • paddingEnd的数值可以根据你使用的图标大小调整,保证输入内容和按钮不重叠;
  • 切换输入类型后设置光标到末尾是个细节优化,能避免用户输入到一半切换时,光标突然跳转到开头的尴尬情况。

这种方案完全保留了普通EditText的原生高度和样式,不需要硬编码高度,完美符合你的需求~

内容的提问来源于stack exchange,提问作者Damn Vegetables

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:05:29