0

0

如何实现带阴影与圆角的自定义密码输入框(兼容密码显示切换)

霞舞

霞舞

发布时间:2026-01-16 13:33:06

|

175人浏览过

|

来源于php中文网

原创

如何实现带阴影与圆角的自定义密码输入框(兼容密码显示切换)

本文详解如何在 android 中使用 material design 组件正确实现带阴影、圆角背景及密码可见切换功能的自定义 edittext,解决 textinputlayout 内嵌 textinputedittext 时因背景覆盖导致阴影/边框失效的问题。

在 Android 开发中,许多开发者希望为密码输入框添加视觉增强效果——例如柔和阴影、大圆角背景以及可切换的密码明文显示功能。但直接在 TextInputLayout 中为 TextInputEditText 设置自定义背景(如 @drawable/edittext_background)会导致 Material 组件默认的轮廓边框(OutlinedBox)和阴影被遮盖,尤其当启用 app:endIconMode="password_toggle" 时,TextInputLayout 的内部绘制逻辑会与自定义背景冲突,最终呈现为“无阴影、无圆角、边框断裂”的错误效果(如问题中第二张图所示)。

根本原因:TextInputLayout 的 OutlinedBox 样式依赖其自身绘制的描边与内边距,若子 TextInputEditText 设置了非透明背景(尤其是带 padding 或 shape 的 drawable),将完全覆盖父容器的视觉层,导致阴影(elevation)、轮廓线、焦点动画等 Material 特性失效。

推荐解决方案:改用 CardView + 原生 EditText 实现高度可控的自定义外观

CardView 天然支持 cardElevation(阴影)、cardCornerRadius(圆角)和 cardBackgroundColor(背景色),且不干扰 EditText 的输入行为与密码切换逻辑。配合手动添加密码可见图标,即可完美替代 TextInputLayout 的受限方案:

绘蛙
绘蛙

电商场景的AI创作平台,无需高薪聘请商拍和文案团队,使用绘蛙即可低成本、批量创作优质的商拍图、种草文案

下载
<androidx.cardview.widget.CardView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:cardCornerRadius="25dp"
    app:cardElevation="8dp"
    app:cardBackgroundColor="#1E1E1E"
    app:cardUseCompatPadding="true"
    android:layout_marginStart="50dp"
    android:layout_marginEnd="42dp"
    android:layout_marginTop="10dp">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:gravity="center_vertical">

        <EditText
            android:id="@+id/editTextPassword"
            android:layout_width="0dp"
            android:layout_height="50dp"
            android:layout_weight="1"
            android:background="@null" <!-- 关键:禁用默认背景,避免遮挡 -->
            android:paddingHorizontal="16dp"
            android:paddingStart="24dp"
            android:inputType="textPassword"
            android:textColor="@android:color/white"
            android:textColorHint="@color/textHint"
            android:hint="@string/password"
            android:fontFamily="sans-serif"
            android:textSize="16sp" />

        <ImageButton
            android:id="@+id/btnTogglePassword"
            android:layout_width="48dp"
            android:layout_height="48dp"
            android:background="?attr/selectableItemBackgroundBorderless"
            android:src="@drawable/ic_eye_off"
            android:tint="@color/textHint"
            android:contentDescription="@string/action_toggle_password_visibility"
            android:layout_marginEnd="12dp" />
    </LinearLayout>
</androidx.cardview.widget.CardView>

? 关键要点说明

  • android:background="@null" 必须设置在 EditText 上,确保 CardView 的圆角与阴影完整透出;
  • 使用 LinearLayout 包裹 EditText + ImageButton 可灵活控制图标位置与点击区域;
  • 密码切换逻辑需在 Kotlin/Java 中手动实现(监听 btnTogglePassword 点击,切换 inputType 并更新图标);
  • app:cardUseCompatPadding="true" 可避免阴影被裁剪(尤其在 API < 21 时);
  • 若需保持 Material 主题一致性,可将 CardView 的 cardBackgroundColor 替换为 ?attr/colorSurface。

⚠️ 注意:TextInputLayout 仍是表单验证、浮动提示、错误信息展示的首选组件;本方案适用于纯视觉定制优先、无需内置验证/错误提示的场景。如需两者兼顾,建议通过自定义 TextInputLayout 子类或 MaterialTheme 覆盖 shapeAppearanceOverlay 属性实现深度定制,而非硬设 EditText 背景。

通过 CardView 方案,你将获得稳定、可复用、符合设计规范的密码输入体验——阴影清晰、圆角自然、图标响应灵敏,且完全兼容深色模式与动态主题切换。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Kotlin协程编程与Spring Boot集成实践
Kotlin协程编程与Spring Boot集成实践

本专题围绕 Kotlin 协程机制展开,深入讲解挂起函数、协程作用域、结构化并发与异常处理机制,并结合 Spring Boot 展示协程在后端开发中的实际应用。内容涵盖异步接口设计、数据库调用优化、线程资源管理以及性能调优策略,帮助开发者构建更加简洁高效的 Kotlin 后端服务架构。

123

2026.02.12

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

254

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1089

2024.03.01

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

254

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1089

2024.03.01

css中的padding属性作用
css中的padding属性作用

在CSS中,padding属性用于设置元素的内边距。想了解更多padding的相关内容,可以阅读本专题下面的文章。

175

2023.12.07

android开发三大框架
android开发三大框架

android开发三大框架是XUtil框架、volley框架、ImageLoader框架。本专题为大家提供android开发三大框架相关的各种文章、以及下载和课程。

338

2023.08.14

android是什么系统
android是什么系统

Android是一种功能强大、灵活可定制、应用丰富、多任务处理能力强、兼容性好、网络连接能力强的操作系统。本专题为大家提供android相关的文章、下载、课程内容,供大家免费下载体验。

1819

2023.08.22

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 4.4万人学习

C# 教程
C# 教程

共94课时 | 11.2万人学习

Java 教程
Java 教程

共578课时 | 81.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号