Xamarin Forms:如何从Android MainActivity传递数据到PCL MainPage
嘿,我来给你分享几个在Xamarin.Forms里把Android端MainActivity的字符串传到PCL端MainPage的实用方法,都是我平时开发里常用的,你可以根据自己的场景选:
方法1:利用App类的全局属性
这是最简单直接的方式,适合需要全局共享这个字符串的场景:
- 首先在PCL项目的
App.cs里添加一个公共属性:
public string MySharedString { get; set; }
- 然后到Android项目的
MainActivity.cs里,在初始化Forms之后、加载App之前,给这个属性赋值:
protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); Xamarin.Forms.Forms.Init(this, savedInstanceState); // 这里是你要传递的字符串 string androidSideString = "来自Android端的内容"; // 给App类的属性赋值 ((App)Xamarin.Forms.Application.Current).MySharedString = androidSideString; LoadApplication(new App()); }
- 最后在PCL的
MainPage.xaml.cs里,比如在OnAppearing方法或者构造函数里获取这个值:
protected override void OnAppearing() { base.OnAppearing(); string receivedString = ((App)Application.Current).MySharedString; // 比如把字符串显示在Label上 MyDisplayLabel.Text = receivedString; }
方法2:用MessagingCenter传递消息
如果是需要动态传递(比如不是初始化时,而是后续某个时机传递),MessagingCenter是个不错的选择,它是Xamarin.Forms自带的消息订阅/发布机制:
- 先在PCL的
MainPage.xaml.cs里订阅消息,比如放在构造函数里:
public MainPage() { InitializeComponent(); // 订阅名为"SendAndroidString"的消息,参数类型是string MessagingCenter.Subscribe<MainActivity, string>(this, "SendAndroidString", (sender, passedString) => { // 收到消息后更新UI,注意要在主线程操作 Device.BeginInvokeOnMainThread(() => { MyDisplayLabel.Text = passedString; }); }); }
- 然后到Android的
MainActivity.cs里发布消息:
protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); Xamarin.Forms.Forms.Init(this, savedInstanceState); LoadApplication(new App()); string androidSideString = "来自Android的动态消息"; // 发布消息 MessagingCenter.Send(this, "SendAndroidString", androidSideString); }
注意:记得在页面销毁时取消订阅,避免内存泄漏,比如在MainPage的OnDisappearing方法里:
protected override void OnDisappearing() { base.OnDisappearing(); MessagingCenter.Unsubscribe<MainActivity, string>(this, "SendAndroidString"); }
方法3:通过构造函数传递
如果这个字符串只需要在MainPage初始化时传递一次,用构造函数传参是最直接的:
- 先修改PCL的
MainPage.xaml.cs构造函数,添加字符串参数:
public MainPage(string androidString) { InitializeComponent(); // 直接用参数初始化UI MyDisplayLabel.Text = androidString; }
- 然后修改PCL的
App.cs构造函数,接收Page参数:
public App(MainPage initialPage) { InitializeComponent(); MainPage = initialPage; }
- 最后到Android的
MainActivity.cs里,创建MainPage时传入字符串,再加载App:
protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); Xamarin.Forms.Forms.Init(this, savedInstanceState); string androidSideString = "来自Android的构造参数"; // 创建MainPage并传入字符串 var mainPage = new MainPage(androidSideString); // 加载App时传入这个MainPage LoadApplication(new App(mainPage)); }
这三个方法各有适用场景:全局属性适合简单的全局共享,MessagingCenter适合跨组件的动态消息传递,构造函数适合初始化时一次性传递,你可以根据自己的需求选~
内容的提问来源于stack exchange,提问作者Sreejith Sree
相关产品推荐
相关产品推荐

