添加了界面及逻辑
This commit is contained in:
@@ -2,12 +2,16 @@ package com.sw.platecabinet.activity
|
||||
|
||||
import android.app.Dialog
|
||||
import android.content.Context
|
||||
import android.os.Build
|
||||
import android.os.Bundle
|
||||
import android.text.TextUtils
|
||||
import android.view.View
|
||||
import android.view.WindowInsetsController
|
||||
import android.view.WindowManager
|
||||
import android.widget.TextView
|
||||
import androidx.activity.enableEdgeToEdge
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import androidx.core.view.WindowCompat
|
||||
import androidx.viewbinding.ViewBinding
|
||||
import com.sw.inbound.utils.DateTimeUtils
|
||||
import com.sw.platecabinet.R
|
||||
@@ -19,7 +23,6 @@ import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.Job
|
||||
import kotlinx.coroutines.launch
|
||||
import timber.log.Timber
|
||||
|
||||
/**
|
||||
* activity 基类
|
||||
@@ -30,54 +33,123 @@ abstract class BaseActivity<VB : ViewBinding> : AppCompatActivity() {
|
||||
protected lateinit var context: Context
|
||||
private var timeJob: Job? = null
|
||||
private var mDialogWaiting: CustomDialog? = null
|
||||
private val permissionHelpers = mutableMapOf<Int, PermissionHelper>()
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
enableEdgeToEdge()
|
||||
context = this
|
||||
disableSystemUICompletely()
|
||||
// 确保内容延伸到导航栏区域
|
||||
WindowCompat.setDecorFitsSystemWindows(window, false)
|
||||
|
||||
binding = inflateViewBinding()
|
||||
headerBinding = inflateTitleBinding()
|
||||
setContentView(binding.root)
|
||||
updateTime()
|
||||
registerDataChange()
|
||||
initialize()
|
||||
}
|
||||
|
||||
fun updateTime() {
|
||||
headerBinding?.let {
|
||||
headerBinding!!.tvRightTime.setClickListeners(
|
||||
it.tvLeftDate.setClickListeners(
|
||||
onDoubleClick = {
|
||||
MainActivity.start(context, pageType = PageType.SETTING_LIST)
|
||||
onLeftDoubleClick()
|
||||
}
|
||||
)
|
||||
it.tvRightTime.setClickListeners(
|
||||
onDoubleClick = {
|
||||
onRightDoubleClick()
|
||||
}
|
||||
)
|
||||
val scope = CoroutineScope(Dispatchers.Main)
|
||||
timeJob = scope.launch {
|
||||
DateTimeUtils.realTimeChineseDateFlow()
|
||||
.collect { (date, time) ->
|
||||
headerBinding!!.tvLeftDate.text = date
|
||||
headerBinding!!.tvRightTime.text = time
|
||||
it.tvLeftDate.text = date
|
||||
it.tvRightTime.text = time
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
open fun onLeftDoubleClick() {
|
||||
|
||||
}
|
||||
|
||||
open fun onRightDoubleClick() {
|
||||
MainActivity.start(context, pageType = PageType.SETTING_LIST)
|
||||
}
|
||||
|
||||
override fun onRequestPermissionsResult(
|
||||
requestCode: Int,
|
||||
permissions: Array<out String>,
|
||||
grantResults: IntArray
|
||||
) {
|
||||
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
|
||||
// 统一处理权限拒绝情况
|
||||
|
||||
val helper = permissionHelpers[requestCode]
|
||||
val allGranted = PermissionHelper.handlePermissionResult(
|
||||
this,
|
||||
requestCode,
|
||||
permissions,
|
||||
grantResults
|
||||
) { permanentlyDeniedPermissions ->
|
||||
// 权限被永久拒绝的统一处理
|
||||
Timber.e("用户永久拒绝权限 $permanentlyDeniedPermissions")
|
||||
grantResults,
|
||||
permissionHelper = helper
|
||||
)
|
||||
|
||||
if (allGranted) {
|
||||
permissionHelpers.remove(requestCode)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 注册PermissionHelper以便处理结果
|
||||
*/
|
||||
fun registerPermissionHelper(helper: PermissionHelper) {
|
||||
permissionHelpers[helper.requestCode] = helper
|
||||
}
|
||||
|
||||
override fun onResume() {
|
||||
super.onResume()
|
||||
// 关键点2:防止某些场景下系统栏恢复
|
||||
enforceImmersiveMode()
|
||||
}
|
||||
|
||||
private fun disableSystemUICompletely() {
|
||||
// 禁用系统手势(Android 10+)
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
|
||||
window.insetsController?.systemBarsBehavior =
|
||||
WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
|
||||
}
|
||||
|
||||
|
||||
// 全屏+隐藏导航栏(所有版本通用)
|
||||
window.decorView.systemUiVisibility = (
|
||||
View.SYSTEM_UI_FLAG_FULLSCREEN
|
||||
or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
|
||||
or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
|
||||
or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
|
||||
or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
|
||||
or View.SYSTEM_UI_FLAG_LAYOUT_STABLE
|
||||
)
|
||||
|
||||
// 禁止窗口扩展至系统栏区域(彻底锁定)
|
||||
window.addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS)
|
||||
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
|
||||
}
|
||||
|
||||
private fun enforceImmersiveMode() {
|
||||
// 持续强制隐藏系统栏(防止手势触发)
|
||||
window.decorView.postDelayed({
|
||||
window.decorView.systemUiVisibility = (
|
||||
View.SYSTEM_UI_FLAG_FULLSCREEN
|
||||
or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
|
||||
or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
|
||||
)
|
||||
}, 100) // 延迟100ms确保覆盖手势触发
|
||||
}
|
||||
|
||||
/**
|
||||
* 显示等待提示框
|
||||
*/
|
||||
@@ -105,6 +177,8 @@ abstract class BaseActivity<VB : ViewBinding> : AppCompatActivity() {
|
||||
|
||||
protected abstract fun initialize()
|
||||
|
||||
protected open fun registerDataChange() {}
|
||||
|
||||
override fun onDestroy() {
|
||||
timeJob?.cancel()
|
||||
super.onDestroy()
|
||||
|
||||
Reference in New Issue
Block a user