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

如何在全屏模式下设置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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:24:15