如何在不使用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
相关产品推荐
相关产品推荐

