| | |
| | | import android.os.Bundle |
| | | import android.util.Log |
| | | import android.view.View |
| | | import android.view.WindowInsets |
| | | import android.view.WindowManager |
| | | import android.view.inputmethod.InputMethodManager |
| | | import android.webkit.CookieManager |
| | | import android.webkit.JavascriptInterface |
| | | import android.webkit.WebChromeClient |
| | |
| | | // 1. 从 DecorView 移除全屏视图 |
| | | val decorView = window.decorView as FrameLayout |
| | | decorView.removeView(customView) |
| | | |
| | | // 2. 清理状态 |
| | | mCustomView = null |
| | | mCustomViewCallback?.onCustomViewHidden() |
| | | mCustomViewCallback = null |
| | | |
| | | // 3. 恢复系统 UI |
| | | showSystemUI() |
| | | // 2. 彻底清理全屏 Window flag(关键!) |
| | | // 很多人只恢复了 systemUiVisibility,但忘了清除 Window flag |
| | | window.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN) |
| | | window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS) |
| | | window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION) |
| | | |
| | | // 4. 恢复原始屏幕方向 |
| | | // 3. 恢复非全屏的 UI 可见性 |
| | | window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_VISIBLE |
| | | |
| | | // 4. 恢复屏幕方向 |
| | | requestedOrientation = mOriginalOrientation |
| | | |
| | | // 5. 关键:重建 IME 关联 |
| | | // 先让 WebView 完全失去焦点 |
| | | webView.clearFocus() |
| | | |
| | | // 6. 下一帧再重新获得焦点,触发 IMM 重建 served view |
| | | webView.post { |
| | | webView.requestFocus() |
| | | } |
| | | } |
| | | } |
| | | webView.webViewClient = object : WebViewClient() { |
| | |
| | | or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |
| | | or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |
| | | or View.SYSTEM_UI_FLAG_FULLSCREEN |
| | | or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY |
| | | or View.SYSTEM_UI_FLAG_IMMERSIVE // 不再使用 STICKY |
| | | ) |
| | | } else { |
| | | window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN) |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 恢复系统 UI 显示 |
| | | */ |
| | | private fun showSystemUI() { |
| | | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { |
| | | window.decorView.systemUiVisibility = mOriginalSystemUiVisibility |
| | | } else { |
| | | window.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN) |
| | | window.setFlags( |
| | | WindowManager.LayoutParams.FLAG_FULLSCREEN, |
| | | WindowManager.LayoutParams.FLAG_FULLSCREEN |
| | | ) |
| | | } |
| | | } |
| | | |