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

Xamarin Android:如何从自定义WebViewClient调用Activity方法隐藏启动图?

解决Xamarin Android中WebView加载完成后隐藏启动图片的问题

我来帮你搞定这个问题!你之前尝试的方法没生效,核心原因是在MyWebViewClient里没法正确访问MainActivity的UI控件和方法——要么是传入的上下文不对,要么是没确保UI操作在主线程执行。下面给你两个简单靠谱的方案:

方案一:通过弱引用持有Activity实例(避免内存泄漏)

这个方案既可以调用Activity的HideSplash方法,又能避免因为WebViewClient持有Activity引用导致的内存泄漏问题:

首先修改你的MyWebViewClient类:

public class MyWebViewClient : WebViewClient
{
    // 用弱引用持有Activity,防止内存泄漏
    private readonly WeakReference<MainActivity> _mainActivityRef;

    public MyWebViewClient(MainActivity activity)
    {
        _mainActivityRef = new WeakReference<MainActivity>(activity);
    }

    public override void OnPageFinished(WebView view, string url)
    {
        base.OnPageFinished(view, url);
        
        // 尝试获取Activity实例
        if (_mainActivityRef.TryGetTarget(out MainActivity currentActivity))
        {
            // 确保UI操作在主线程执行(虽然OnPageFinished大概率在主线程,但保险起见加上)
            currentActivity.RunOnUiThread(() =>
            {
                currentActivity.HideSplash();
            });
        }
    }
}

然后在MainActivity的OnCreate方法里初始化WebViewClient时,传入当前Activity实例:

my_web_client = new MyWebViewClient(this); // 这里传this而不是ApplicationContext
app_view.SetWebViewClient(my_web_client);

方案二:用委托事件解耦(更优雅的写法)

如果你不想让WebViewClient依赖具体的Activity类,可以用委托事件来实现,代码更解耦:

先修改MyWebViewClient,定义一个加载完成的事件:

public class MyWebViewClient : WebViewClient
{
    // 定义页面加载完成的事件
    public event Action OnPageLoadCompleted;

    public override void OnPageFinished(WebView view, string url)
    {
        base.OnPageFinished(view, url);
        // 触发事件
        OnPageLoadCompleted?.Invoke();
    }
}

然后在MainActivity里订阅这个事件,处理隐藏启动图的逻辑:

my_web_client = new MyWebViewClient();
// 订阅加载完成事件
my_web_client.OnPageLoadCompleted += () =>
{
    // 主线程执行UI操作
    RunOnUiThread(() => HideSplash());
};
app_view.SetWebViewClient(my_web_client);

额外注意事项

  • 确保你的布局文件Main.axml里确实存在imageSplash这个ImageView控件,ID要和代码里的Resource.Id.imageSplash对应。
  • 一定要用RunOnUiThread包裹UI操作:虽然OnPageFinished方法通常在主线程执行,但为了避免极端情况(比如某些WebView实现的线程差异),加上这个方法能保证操作在UI线程执行,防止崩溃或不生效。

内容的提问来源于stack exchange,提问作者BK52

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:19:34