11package com.github.aachartmodel.aainfographics.demo.basiccontent
22import android.content.Intent
3+ import android.os.Build
34import android.os.Bundle
5+ import android.util.Log
6+ import android.view.View
7+ import android.view.WindowInsetsController
8+ import android.view.WindowManager
49import android.widget.ExpandableListView
510import android.widget.Toast
611import androidx.appcompat.app.AppCompatActivity
12+ import androidx.core.view.ViewCompat
13+ import androidx.core.view.WindowCompat
14+ import androidx.core.view.WindowInsetsCompat
15+ import androidx.core.view.updatePadding
716import com.github.aachartmodel.aainfographics.aachartcreator.AAChartType
817import com.github.aachartmodel.aainfographics.demo.R
918import com.github.aachartmodel.aainfographics.demo.additionalcontent.*
19+ import androidx.core.view.WindowInsetsControllerCompat
1020
1121class MainActivity : AppCompatActivity () {
1222 private val chartTypeNameArr =
@@ -416,10 +426,90 @@ class MainActivity : AppCompatActivity() {
416426 override fun onCreate (savedInstanceState : Bundle ? ) {
417427 super .onCreate(savedInstanceState)
418428 setContentView(R .layout.activity_main)
429+ enableEdgeToEdgeUI()
430+ setupWindowInsets()
419431 setupExpandableListView()
420432 }
421433
422- private fun setupExpandableListView () {
434+ private fun enableEdgeToEdgeUI () {
435+ WindowCompat .setDecorFitsSystemWindows(window, false )
436+ val white = android.graphics.Color .WHITE
437+ window.statusBarColor = android.graphics.Color .TRANSPARENT
438+ if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .LOLLIPOP ) {
439+ window.navigationBarColor = android.graphics.Color .TRANSPARENT
440+ }
441+ if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .LOLLIPOP ) {
442+ window.addFlags(WindowManager .LayoutParams .FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS )
443+ window.clearFlags(WindowManager .LayoutParams .FLAG_TRANSLUCENT_STATUS )
444+ window.clearFlags(WindowManager .LayoutParams .FLAG_TRANSLUCENT_NAVIGATION )
445+ }
446+ if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .P ) {
447+ window.attributes.layoutInDisplayCutoutMode =
448+ WindowManager .LayoutParams .LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
449+ }
450+ if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .Q ) {
451+ window.isNavigationBarContrastEnforced = false
452+ window.isStatusBarContrastEnforced = false
453+ }
454+ val controller = WindowInsetsControllerCompat (window, window.decorView)
455+ controller.isAppearanceLightStatusBars = true
456+ if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .O ) {
457+ controller.isAppearanceLightNavigationBars = true
458+ }
459+ // 为 R 以下版本补齐旧式 flag 以真正让内容延伸到导航栏后面
460+ if (Build .VERSION .SDK_INT < Build .VERSION_CODES .R ) {
461+ @Suppress(" DEPRECATION" )
462+ window.decorView.systemUiVisibility = (
463+ View .SYSTEM_UI_FLAG_LAYOUT_STABLE or
464+ View .SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or
465+ View .SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
466+ )
467+ }
468+ }
469+
470+ private fun setupWindowInsets () {
471+ val rootView = findViewById<View >(android.R .id.content)
472+ val bottomSpacer = rootView.findViewById<View >(R .id.nav_inset_spacer)
473+ val listView = findViewById<ExpandableListView >(R .id.exlist_lol)
474+ rootView.setBackgroundColor(android.graphics.Color .WHITE )
475+
476+ ViewCompat .setOnApplyWindowInsetsListener(rootView) { _, insets ->
477+ val sysBars = insets.getInsets(WindowInsetsCompat .Type .systemBars())
478+ listView.updatePadding(top = sysBars.top)
479+ bottomSpacer?.let { spacer ->
480+ spacer.layoutParams = spacer.layoutParams.apply { height = sysBars.bottom }
481+ spacer.visibility = if (sysBars.bottom > 0 ) View .VISIBLE else View .GONE
482+ }
483+ listView.updatePadding(bottom = sysBars.bottom)
484+ adjustNavBarColorByMode(sysBars.bottom)
485+ Log .d(" EdgeToEdge" , " topInset=${sysBars.top} , bottomInset=${sysBars.bottom} " )
486+ insets
487+ }
488+ }
489+
490+ private fun adjustNavBarColorByMode (bottomInset : Int ) {
491+ // 粗略判断: 如果 bottomInset 很大(>= 80px) 说明是传统三键或导航条高度区域, 此时透明在部分 ROM 会退回黑色, 用白色与内容融合
492+ // 如果很小(0~40) 多半是手势导航, 可以保持透明达到真正边到边
493+ val isLikelyThreeButton = bottomInset >= 80
494+ if (isLikelyThreeButton) {
495+ // 使用与内容相同的白色, 避免设备强制绘制黑背景
496+ if (window.navigationBarColor != android.graphics.Color .WHITE ) {
497+ window.navigationBarColor = android.graphics.Color .WHITE
498+ }
499+ } else {
500+ // 手势模式保持透明
501+ if (window.navigationBarColor != android.graphics.Color .TRANSPARENT && Build .VERSION .SDK_INT >= Build .VERSION_CODES .LOLLIPOP ) {
502+ window.navigationBarColor = android.graphics.Color .TRANSPARENT
503+ }
504+ }
505+ }
506+
507+ private fun setupExpandableListView () {
508+ val expandableListView = findViewById<ExpandableListView >(R .id.exlist_lol)
509+
510+ // 为ExpandableListView设置背景色,确保覆盖整个区域
511+ expandableListView.setBackgroundColor(android.graphics.Color .WHITE )
512+
423513 val groupTitleArr = arrayOf(
424514 " Basic Type Chart ---基础类型图表" ,
425515 " Special Type Chart ---特殊类型图表" ,
@@ -612,4 +702,5 @@ class MainActivity : AppCompatActivity() {
612702 companion object {
613703 private const val kChartTypeKey = " chartType"
614704 }
615- }
705+ }
706+
0 commit comments