You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 19:45:34