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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:52:35