如何通过setKeepOnScreenCondition让启动屏保持至WebViewFragment加载完成?
实现启动屏等待WebView加载完成的方案
核心是通过Activity与Fragment的状态通信,让MainActivity感知WebView的页面加载状态,从而控制启动屏的显示时长。以下是两种可靠的实现方式:
方式一:使用LiveData(推荐,生命周期安全)
1. 在MainActivity中初始化启动屏与状态变量
class MainActivity : AppCompatActivity() { // 标记WebView是否加载完成,默认未完成 private val webViewLoaded = MutableLiveData<Boolean>().apply { value = false } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 初始化启动屏 val splashScreen = installSplashScreen() // 设置启动屏保持条件:只要WebView未加载完成,就持续显示 splashScreen.setKeepOnScreenCondition { webViewLoaded.value == false } // 加载WebViewFragment到布局容器 supportFragmentManager.beginTransaction() .replace(R.id.fragment_container, WebViewFragment()) .commit() } }
2. 在WebViewFragment中监听页面加载完成事件
在WebView的WebViewClient回调中更新MainActivity的状态:
class WebViewFragment : Fragment() { private lateinit var webView: WebView override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { val rootView = inflater.inflate(R.layout.fragment_webview, container, false) webView = rootView.findViewById(R.id.web_view) setupWebView() return rootView } private fun setupWebView() { // 基础WebView配置(根据需求调整) webView.settings.javaScriptEnabled = true webView.webViewClient = object : WebViewClient() { override fun onPageFinished(view: WebView?, url: String?) { super.onPageFinished(view, url) // 更新MainActivity中的加载状态,触发启动屏隐藏 (activity as MainActivity).webViewLoaded.postValue(true) } // 可选:处理加载失败的情况,避免启动屏一直显示 override fun onReceivedError( view: WebView?, request: WebResourceRequest?, error: WebResourceError? ) { super.onReceivedError(view, request, error) (activity as MainActivity).webViewLoaded.postValue(true) } } // 加载目标网页 webView.loadUrl("https://your-target-url.com") } }
方式二:使用接口回调(适合Java项目或更灵活的场景)
1. 定义回调接口
interface OnWebViewLoadCompleteListener { fun onWebViewLoadComplete() }
2. MainActivity实现接口并控制启动屏
class MainActivity : AppCompatActivity(), OnWebViewLoadCompleteListener { private var isWebViewLoaded = false override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val splashScreen = installSplashScreen() splashScreen.setKeepOnScreenCondition { !isWebViewLoaded } supportFragmentManager.beginTransaction() .replace(R.id.fragment_container, WebViewFragment()) .commit() } override fun onWebViewLoadComplete() { isWebViewLoaded = true // 状态更新后,启动屏会自动隐藏 } }
3. WebViewFragment绑定并触发回调
class WebViewFragment : Fragment() { private var loadCompleteListener: OnWebViewLoadCompleteListener? = null private lateinit var webView: WebView override fun onAttach(context: Context) { super.onAttach(context) // 绑定Activity作为回调接收者 loadCompleteListener = context as? OnWebViewLoadCompleteListener } override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { val rootView = inflater.inflate(R.layout.fragment_webview, container, false) webView = rootView.findViewById(R.id.web_view) setupWebView() return rootView } private fun setupWebView() { webView.settings.javaScriptEnabled = true webView.webViewClient = object : WebViewClient() { override fun onPageFinished(view: WebView?, url: String?) { super.onPageFinished(view, url) loadCompleteListener?.onWebViewLoadComplete() } override fun onReceivedError( view: WebView?, request: WebResourceRequest?, error: WebResourceError? ) { super.onReceivedError(view, request, error) loadCompleteListener?.onWebViewLoadComplete() } } webView.loadUrl("https://your-target-url.com") } override fun onDetach() { super.onDetach() // 解绑回调,避免内存泄漏 loadCompleteListener = null } }
关键注意事项
- 务必处理WebView加载失败的场景,否则启动屏可能会一直显示。
- LiveData的
postValue方法适合在子线程调用(WebView回调可能不在主线程),确保状态更新到主线程。 - 如果使用接口回调,在Fragment的
onDetach中解绑回调,避免内存泄漏。
内容的提问来源于stack exchange,提问作者coolguy
相关产品推荐
相关产品推荐

