如何实现Android底部弹出Activity,内部CardView含EditText与按钮
Android底部弹出输入型Activity实现步骤
1. 自定义Activity主题
在res/values/styles.xml中添加底部弹窗专用主题:
<style name="BottomSheetActivityTheme" parent="Theme.MaterialComponents.Light.NoActionBar"> <item name="android:windowBackground">@android:color/transparent</item> <item name="android:windowIsFloating">false</item> <item name="android:windowNoTitle">true</item> <item name="android:windowEnterAnimation">@anim/slide_in_bottom</item> <item name="android:windowExitAnimation">@anim/slide_out_bottom</item> <item name="android:backgroundDimEnabled">true</item> <item name="android:backgroundDimAmount">0.5</item> </style>
2. 添加弹出/关闭动画
新建res/anim文件夹,添加两个动画文件:
- 进入动画
slide_in_bottom.xml
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:duration="300" android:fromYDelta="100%p" android:toYDelta="0" /> <alpha android:duration="300" android:fromAlpha="0.0" android:toAlpha="1.0" /> </set>
- 退出动画
slide_out_bottom.xml
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:duration="300" android:fromYDelta="0" android:toYDelta="100%p" /> <alpha android:duration="300" android:fromAlpha="1.0" android:toAlpha="0.0" /> </set>
3. 注册Activity并配置软键盘适配
在AndroidManifest.xml中给目标Activity绑定主题:
<activity android:name=".BottomInputActivity" android:theme="@style/BottomSheetActivityTheme" android:windowSoftInputMode="adjustResize" />
4. 编写布局文件(activity_bottom_input.xml)
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/root_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="bottom" android:padding="16dp"> <com.google.android.material.card.MaterialCardView android:id="@+id/card_view" android:layout_width="match_parent" android:layout_height="wrap_content" app:cardCornerRadius="16dp" app:cardElevation="8dp"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:padding="24dp"> <EditText android:id="@+id/input_et" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="请输入内容" android:inputType="text" /> <Button android:id="@+id/submit_btn" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="16dp" android:text="提交" /> </LinearLayout> </com.google.android.material.card.MaterialCardView> </FrameLayout>
5. 编写Activity逻辑代码
class BottomInputActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_bottom_input) // 点击空白区域关闭页面 findViewById<FrameLayout>(R.id.root_layout).setOnClickListener { finish() } // 拦截CardView点击事件,避免点输入区域触发关闭 findViewById<MaterialCardView>(R.id.card_view).setOnClickListener { } // 按钮点击处理逻辑 findViewById<Button>(R.id.submit_btn).setOnClickListener { val inputContent = findViewById<EditText>(R.id.input_et).text.toString() // 自行处理输入内容的业务逻辑 finish() } } override fun finish() { super.finish() // 绑定退出动画 overridePendingTransition(R.anim.slide_in_bottom, R.anim.slide_out_bottom) } }
注意事项
- 使用Java开发的项目直接把上述Kotlin代码转换为对应Java语法即可,逻辑完全一致
- 需确保项目引入Material组件库,在module级build.gradle的dependencies中添加
implementation 'com.google.android.material:material:1.9.0'即可 - 不需要点击空白关闭的话,直接删除根布局的点击监听即可
- 已配置软键盘自动顶起布局,不需要额外处理输入框遮挡问题
内容的提问来源于stack exchange,提问作者MiniDev99
相关产品推荐
相关产品推荐

