Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 4 additions & 10 deletions app/src/main/java/com/hjq/demo/app/AppActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ import com.hjq.demo.R
import com.hjq.demo.action.ImmersionAction
import com.hjq.demo.action.TitleBarAction
import com.hjq.demo.http.model.HttpData
import com.hjq.demo.ktx.paddingBottomNavBar
import com.hjq.demo.ktx.paddingTopStatusBar
import com.hjq.demo.ktx.toast
import com.hjq.demo.ui.dialog.common.WaitDialog
import com.hjq.http.config.IRequestApi
Expand Down Expand Up @@ -108,18 +110,10 @@ abstract class AppActivity : BaseActivity(), TitleBarAction, ImmersionAction, On
// 适配 Android 15 EdgeToEdge 特性
if (isAndroid15()) {
window.decorView.setOnApplyWindowInsetsListener { _, insets ->
val systemBars = insets.getInsets(WindowInsets.Type.systemBars())
val immersionTopView = getImmersionTopView()
val immersionBottomView = getImmersionBottomView()
if (immersionTopView != null && immersionTopView === immersionBottomView) {
immersionTopView.setPadding(immersionTopView.getPaddingLeft(), systemBars.top,
immersionTopView.getPaddingRight(), systemBars.bottom)
return@setOnApplyWindowInsetsListener insets
}
immersionTopView?.setPadding(immersionTopView.getPaddingLeft(), systemBars.top,
immersionTopView.getPaddingRight(), immersionTopView.paddingBottom)
immersionBottomView?.setPadding(immersionBottomView.getPaddingLeft(), immersionBottomView.paddingTop,
immersionBottomView.getPaddingRight(), systemBars.bottom)
immersionTopView?.paddingTopStatusBar()
immersionBottomView?.paddingBottomNavBar()
return@setOnApplyWindowInsetsListener insets
}
} else {
Expand Down
14 changes: 4 additions & 10 deletions app/src/main/java/com/hjq/demo/app/TitleBarFragment.kt
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ import com.hjq.core.ktx.isAndroid15
import com.hjq.demo.R
import com.hjq.demo.action.ImmersionAction
import com.hjq.demo.action.TitleBarAction
import com.hjq.demo.ktx.paddingBottomNavBar
import com.hjq.demo.ktx.paddingTopStatusBar

/**
* author : Android 轮子哥
Expand Down Expand Up @@ -38,18 +40,10 @@ abstract class TitleBarFragment<A : AppActivity> : AppFragment<A>(), TitleBarAct
// 适配 Android 15 EdgeToEdge 特性
if (isAndroid15()) {
view.setOnApplyWindowInsetsListener { _, insets ->
val systemBars = insets.getInsets(WindowInsets.Type.systemBars())
val immersionTopView = getImmersionTopView()
val immersionBottomView = getImmersionBottomView()
if (immersionTopView != null && immersionTopView === immersionBottomView) {
immersionTopView.setPadding(immersionTopView.getPaddingLeft(), systemBars.top,
immersionTopView.getPaddingRight(), systemBars.bottom)
return@setOnApplyWindowInsetsListener insets
}
immersionTopView?.setPadding(immersionTopView.getPaddingLeft(), systemBars.top,
immersionTopView.getPaddingRight(), immersionTopView.paddingBottom)
immersionBottomView?.setPadding(immersionBottomView.getPaddingLeft(), immersionBottomView.paddingTop,
immersionBottomView.getPaddingRight(), systemBars.bottom)
immersionTopView?.paddingTopStatusBar()
immersionBottomView?.paddingBottomNavBar()
return@setOnApplyWindowInsetsListener insets
}
} else {
Expand Down
113 changes: 113 additions & 0 deletions app/src/main/java/com/hjq/demo/ktx/ViewInsetKtx.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
package com.hjq.demo.ktx

import android.view.View
import android.view.ViewGroup
import androidx.core.graphics.Insets
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.updateLayoutParams
import androidx.core.view.updatePadding

/**
* Created by lcw on 2025/6/24
*
* View padding or margin bars
*/

fun WindowInsetsCompat.statusBars(): Insets {
return getInsets(WindowInsetsCompat.Type.statusBars())
}

fun WindowInsetsCompat.navigationBars(): Insets {
return getInsets(WindowInsetsCompat.Type.navigationBars())
}

fun WindowInsetsCompat.ime(): Insets {
return getInsets(WindowInsetsCompat.Type.ime())
}

fun View.paddingBars(appendPaddingPx: Int = 0) {
val originalHeight = this.layoutParams?.height ?: ViewGroup.LayoutParams.WRAP_CONTENT
ViewCompat.setOnApplyWindowInsetsListener(this) { view, insets ->
if (originalHeight > 0) {
view.updateLayoutParams<ViewGroup.MarginLayoutParams> {
height = originalHeight + insets.statusBars().top + insets.navigationBars().bottom
}
}
view.updatePadding(
top = insets.statusBars().top + appendPaddingPx,
bottom = insets.navigationBars().bottom + appendPaddingPx
)
return@setOnApplyWindowInsetsListener insets
}
}

fun View.paddingTopStatusBar(appendPaddingPx: Int = 0) {
val originalHeight = this.layoutParams?.height ?: ViewGroup.LayoutParams.WRAP_CONTENT
ViewCompat.setOnApplyWindowInsetsListener(this) { view, insets ->
if (originalHeight > 0) {
view.updateLayoutParams<ViewGroup.MarginLayoutParams> {
height = originalHeight + insets.statusBars().top
}
}
view.updatePadding(top = insets.statusBars().top + appendPaddingPx)
return@setOnApplyWindowInsetsListener insets
}
}

fun View.paddingBottomNavBar(appendPaddingPx: Int = 0) {
val originalHeight = this.layoutParams?.height ?: ViewGroup.LayoutParams.WRAP_CONTENT
ViewCompat.setOnApplyWindowInsetsListener(this) { view, insets ->
if (originalHeight > 0) {
view.updateLayoutParams<ViewGroup.MarginLayoutParams> {
height = originalHeight + insets.navigationBars().bottom
}
}
view.updatePadding(bottom = insets.navigationBars().bottom + appendPaddingPx)
return@setOnApplyWindowInsetsListener insets
}
}

fun View.marginBars(appendMarginPx: Int = 0) {
ViewCompat.setOnApplyWindowInsetsListener(this) { view, insets ->
view.updateLayoutParams<ViewGroup.MarginLayoutParams> {
topMargin = insets.statusBars().top + appendMarginPx
bottomMargin = insets.navigationBars().bottom + appendMarginPx
}
return@setOnApplyWindowInsetsListener insets
}
}

fun View.marginTopStatusBar(appendMarginPx: Int = 0) {
ViewCompat.setOnApplyWindowInsetsListener(this) { view, insets ->
view.updateLayoutParams<ViewGroup.MarginLayoutParams> {
topMargin = insets.statusBars().top + appendMarginPx
}
return@setOnApplyWindowInsetsListener insets
}
}

fun View.marginBottomNavBar(appendMarginPx: Int = 0) {
ViewCompat.setOnApplyWindowInsetsListener(this) { view, insets ->
view.updateLayoutParams<ViewGroup.MarginLayoutParams> {
bottomMargin = insets.navigationBars().bottom + appendMarginPx
}
return@setOnApplyWindowInsetsListener insets
}
}

fun View.paddingIme(appendMarginPx: Int = 0) {
ViewCompat.setOnApplyWindowInsetsListener(this) { view, insets ->
view.updatePadding(bottom = insets.ime().bottom + appendMarginPx)
return@setOnApplyWindowInsetsListener insets
}
}

fun View.marginIme(appendMarginPx: Int = 0) {
ViewCompat.setOnApplyWindowInsetsListener(this) { view, insets ->
view.updateLayoutParams<ViewGroup.MarginLayoutParams> {
bottomMargin = insets.ime().bottom + appendMarginPx
}
return@setOnApplyWindowInsetsListener insets
}
}