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
相关产品推荐
相关产品推荐

