如何在全屏模式下设置adjustResize?实现底部按钮随键盘上移
解决方案:全屏模式下结合指定Flag实现adjustResize效果
嘿,我之前也折腾过这个问题——当你设置了FLAG_LAYOUT_NO_LIMITS、FLAG_LAYOUT_IN_SCREEN和FLAG_TRANSLUCENT_NAVIGATION这几个Flag后,系统默认的adjustResize会失效,因为这些Flag让窗口突破了系统的布局限制,键盘弹出时系统不会自动调整布局。不过咱们可以通过监听窗口内边距(WindowInsets)来手动实现底部按钮上移的效果,具体步骤如下:
第一步:正确设置Window Flag
首先在Activity的onCreate方法中配置你需要的三个Flag,注意适配不同Android版本:
Kotlin 代码示例
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val window = window // 让DecorView不适应系统窗口,为后续Flag设置铺路 WindowCompat.setDecorFitsSystemWindows(window, false) // 添加指定的三个Flag window.addFlags( WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS or WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN or WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION ) }
Java 代码示例
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Window window = getWindow(); WindowCompat.setDecorFitsSystemWindows(window, false); window.addFlags( WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION ); }
注意:在Android 11(API 30)及以上,
FLAG_TRANSLUCENT_NAVIGATION已被弃用,你可以用WindowInsetsControllerCompat替代来设置导航栏透明:WindowInsetsControllerCompat(window, window.decorView).apply { isAppearanceLightNavigationBars = true // 根据需求设置导航栏图标颜色 systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE }不过如果你必须保留原Flag,上面的代码依然可以在高版本中运行。
第二步:监听键盘Insets,调整底部按钮位置
因为adjustResize已经失效,我们需要手动监听键盘的显示/隐藏事件,通过调整底部按钮的内边距来实现上移效果:
Kotlin 代码示例
假设你的底部按钮ID是btn_bottom:
val bottomBtn = findViewById<Button>(R.id.btn_bottom) ViewCompat.setOnApplyWindowInsetsListener(bottomBtn) { view, insets -> // 获取键盘的内边距高度 val imeInsets = insets.getInsets(WindowInsetsCompat.Type.ime()) // 设置按钮的底部内边距为键盘高度,这样键盘弹出时按钮会自动上移 view.updatePadding(bottom = imeInsets.bottom) // 返回处理后的Insets,让其他视图可以继续处理 insets }
Java 代码示例
Button bottomBtn = findViewById(R.id.btn_bottom); ViewCompat.setOnApplyWindowInsetsListener(bottomBtn, (view, insets) -> { Insets imeInsets = insets.getInsets(WindowInsetsCompat.Type.ime()); view.setPadding( view.getPaddingLeft(), view.getPaddingTop(), view.getPaddingRight(), imeInsets.bottom ); return insets; });
额外提示
- 如果你的布局是用
ConstraintLayout,也可以给底部按钮设置一个动态的底部约束,绑定到键盘的Insets高度,效果是一样的。 - 如果你需要让整个布局都随键盘上移,可以把布局放在
NestedScrollView中,然后监听Insets调整ScrollView的底部padding。
内容的提问来源于stack exchange,提问作者vanste25
相关产品推荐
相关产品推荐

