在WebView(Android Components)中,如何为导航栏添加底部内边距?

移动开发 2026-07-11

我想为WebView中滚动的内容增加底部内边距,这样就不会被导航栏遮挡。同时,我希望在滚动时导航栏保持透明。

WebView实现:

webview:

<WebView
    android:id="@+id/web_view"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:visibility="gone"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@id/appbar_layout" />

fragment:

binding.webView.apply {
    settings.javaScriptEnabled = true
    visible()
    loadDataWithBaseURL("", args.content, "text/html", "UTF-8", null)
}

尝试添加内边距:

val initialPaddingBottom = binding.parishNoticeDetailsWebView.paddingBottom

ViewCompat.setOnApplyWindowInsetsListener(binding.parishNoticeDetailsWebView) 
{ view, insets ->
    val navigationBars = insets.getInsets(WindowInsetsCompat.Type.navigationBars())

    view.updatePadding(
        bottom = initialPaddingBottom + navigationBars.bottom
    )
    insets
}

解决方案

首先,请参考以下内容:https://developer.android.com/develop/ui/views/layout/edge-to-edge

此外,尝试按如下修改你的 Activity

private lateinit var binding: YourActivityLayoutBinding

override fun onCreate(savedInstanceState: Bundle?) {
    enableEdgeToEdge() // Enable edge-to-edge display
    super.onCreate(savedInstanceState)

    binding = YourActivityLayoutBinding.inflate(layoutInflater)
    val rootView = binding.root
    setContentView(rootView)

    /* 
     * Adjusts the root view’s top & bottom padding based on system bars
     * (status/navigation) to ensure content (e.g., WebView) is not
     * overlapped by system UI.
     */
    ViewCompat.setOnApplyWindowInsetsListener(rootView) { v, insets ->
        val resolvedInsets = insets.getInsets(WindowInsetsCompat.Type.systemBars())
        v.updatePadding(
            bottom = binding.webView.paddingBottom + resolvedInsets.bottom,
            top = binding.webView.paddingTop + resolvedInsets.top
        )
        insets
    }

    initWebView()
}

private fun initWebView() {
    binding.webView.apply {
        settings.javaScriptEnabled = true
        visible()
        loadDataWithBaseURL("", args.content, "text/html", "UTF-8", null)
    }
}

注:此edge-to-edge处理可以移至一个通用的 BaseActivity,以避免在多个屏幕之间的重复。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章