Skip to content

Commit 6ea396a

Browse files
committed
fix(android): pass IME insets through to WebView for keyboard viewport resize
WindowInsetsCompat.CONSUMED was preventing the WebView from receiving IME insets, causing visualViewport and innerHeight to not update when the keyboard opens on Android. Changed to only zero out systemBars/displayCutout (which we handle via padding), while letting IME pass through so the WebView's built-in adjustResize mechanism can properly resize the layout viewport.
1 parent 604c0e3 commit 6ea396a

1 file changed

Lines changed: 11 additions & 3 deletions

File tree

src-tauri/gen/android/app/src/main/java/com/opencodeui/app/MainActivity.kt

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import android.os.VibrationEffect
1313
import android.os.Vibrator
1414
import android.os.VibratorManager
1515
import androidx.activity.enableEdgeToEdge
16+
import androidx.core.graphics.Insets
1617
import androidx.core.view.ViewCompat
1718
import androidx.core.view.WindowInsetsCompat
1819
import androidx.core.view.WindowInsetsControllerCompat
@@ -43,7 +44,8 @@ class MainActivity : TauriActivity() {
4344

4445
// 监听 WindowInsets 变化:
4546
// 1. 顶部交给 Web surface 自己绘制,状态栏透明叠在 WebView 上
46-
// 2. 底部仍由原生 padding 处理,让键盘弹出时 WebView 物理 resize
47+
// 2. 底部 padding 包含 IME + systemBars,让键盘弹出时 WebView 物理 resize
48+
// 3. 所有 insets 零化返回(非 CONSUMED),让 WebView 仍能感知键盘更新 viewport
4749
val contentView = findViewById<View>(android.R.id.content)
4850
ViewCompat.setOnApplyWindowInsetsListener(contentView) { view, windowInsets ->
4951
val systemInsets = windowInsets.getInsets(
@@ -54,7 +56,6 @@ class MainActivity : TauriActivity() {
5456
val density = resources.displayMetrics.density
5557
val topInsetCssPx = maxOf(statusBarInsets.top, systemInsets.top) / density
5658

57-
// 键盘弹出时底部取 IME 和系统栏的较大值,让 WebView 整体 resize
5859
val bottomPadding = maxOf(imeInsets.bottom, systemInsets.bottom)
5960
view.setPadding(
6061
systemInsets.left,
@@ -76,7 +77,14 @@ class MainActivity : TauriActivity() {
7677
// 立即尝试注入
7778
tryInjectInsets(view)
7879

79-
WindowInsetsCompat.CONSUMED
80+
// 零化所有 insets 类型(非 CONSUMED),让 WebView 仍能感知键盘更新 viewport
81+
// CONSUMED 会完全吞掉 insets 导致 WebView 无法获取键盘信息
82+
val allTypes = WindowInsetsCompat.Type.systemBars() or
83+
WindowInsetsCompat.Type.displayCutout() or
84+
WindowInsetsCompat.Type.ime()
85+
WindowInsetsCompat.Builder(windowInsets)
86+
.setInsets(allTypes, Insets.of(0, 0, 0, 0))
87+
.build()
8088
}
8189

8290
// WebView 可能还没创建好,轮询几次确保注入成功

0 commit comments

Comments
 (0)