Xamarin.Forms.Android中CrossCurrentActivity.Current.Activity始终为空问题
问题:CrossCurrentActivity.Current.Activity始终为空(Xamarin.Forms.Android)
我在Xamarin.Forms.Android项目中尝试使用Montemagno的CrossCurrentActivity插件获取当前Activity,但不管是执行初始化后还是手动赋值,CrossCurrentActivity.Current.Activity始终为空。以下是我的OnCreate代码:
protected override void OnCreate(Bundle bundle) { TabLayoutResource = Resource.Layout.Tabbar; ToolbarResource = Resource.Layout.Toolbar; base.OnCreate(bundle); Microsoft.WindowsAzure.MobileServices.CurrentPlatform.Init(); global::Xamarin.Forms.Forms.Init(this, bundle); CrossCurrentActivity.Current.Init(this, bundle); // CrossCurrentActivity.Current.Activity is NULL CrossCurrentActivity.Current.Activity = this; // CrossCurrentActivity.Current.Activity is still NULL var formsApp = new App(new AndroidInitializer()); _registryContainer = formsApp.Container; LoadApplication(formsApp); }
请问我哪里操作出错了?
问题分析与解决办法
1. 初始化顺序错误+手动赋值冲突
你现在的代码犯了两个关键错误:
- 初始化顺序不对:
CrossCurrentActivity的初始化应该放在Xamarin.Forms.Forms.Init()之前执行,确保插件先绑定Activity生命周期。 - 不要手动赋值
Activity属性:这个插件的核心就是自动跟踪当前Activity,手动赋值会干扰它的内部逻辑,导致属性被后续的生命周期回调重置为空。
调整后的正确初始化代码:
protected override void OnCreate(Bundle bundle) { TabLayoutResource = Resource.Layout.Tabbar; ToolbarResource = Resource.Layout.Toolbar; base.OnCreate(bundle); // 优先初始化CrossCurrentActivity CrossCurrentActivity.Current.Init(this, bundle); // 再初始化Azure服务和Xamarin.Forms Microsoft.WindowsAzure.MobileServices.CurrentPlatform.Init(); global::Xamarin.Forms.Forms.Init(this, bundle); var formsApp = new App(new AndroidInitializer()); _registryContainer = formsApp.Container; LoadApplication(formsApp); }
2. 检查插件版本与依赖兼容性
确保你安装的Plugin.CurrentActivity NuGet包是最新稳定版本,同时确认它和你的Xamarin.Forms版本兼容。部分旧版本插件在配合新版Forms时,会出现Activity绑定失效的问题。如果版本过旧,尝试升级插件到最新版。
3. 自定义Application类的配置(如果有)
如果你的项目使用了自定义的Application类,必须在它的OnCreate方法中也初始化插件,确保全局生命周期跟踪:
public class MyApplication : Application { public MyApplication(IntPtr handle, JniHandleOwnership transfer) : base(handle, transfer) { } public override void OnCreate() { base.OnCreate(); // 初始化插件 CrossCurrentActivity.Current.Init(this); } }
同时要在AndroidManifest.xml中指定这个自定义Application:
<application android:name=".MyApplication" android:label="@string/app_name" ...>
4. 避免过早访问Activity属性
即使初始化正确,在OnCreate方法中立即访问CrossCurrentActivity.Current.Activity也可能为空——因为此时Forms的Activity绑定还未完全完成。建议将访问逻辑延迟到LoadApplication之后,或者在Forms页面的OnAppearing事件中获取:
// 在Forms项目的主页面中 protected override void OnAppearing() { base.OnAppearing(); var currentActivity = CrossCurrentActivity.Current.Activity; // 这里通常能获取到有效的Activity实例 }
内容的提问来源于stack exchange,提问作者NSouth
相关产品推荐
相关产品推荐

