如何在Xamarin跨平台应用中使用并跳转至各平台原生页面
实现Xamarin.Forms跨平台跳转原生页面的完整方案
核心思路
通过Xamarin自带的DependencyService依赖服务实现跨平台调用,在共享项目中定义跳转接口,Android、iOS平台分别实现对应跳转逻辑,点击按钮时判断当前运行平台触发对应方法即可。
步骤1:共享项目中实现基础逻辑
1.1 定义跳转接口
新建INativePageService.cs文件,代码如下:
public interface INativePageService { // 打开Android原生页面方法 void OpenAndroidNativePage(); // 打开iOS原生页面方法 void OpeniOSNativePage(); }
1.2 主页面添加按钮
主页面XAML文件添加两个按钮:
<StackLayout Padding="20"> <Button Text="跳转至Android页面" x:Name="BtnOpenAndroid" Clicked="BtnOpenAndroid_OnClicked" Margin="0 10"/> <Button Text="跳转至iOS页面" x:Name="BtnOpeniOS" Clicked="BtnOpeniOS_OnClicked" Margin="0 10"/> </StackLayout>
1.3 绑定按钮点击事件
主页面后台C#代码添加事件逻辑:
private void BtnOpenAndroid_OnClicked(object sender, EventArgs e) { if(Device.RuntimePlatform == Device.Android) { DependencyService.Get<INativePageService>().OpenAndroidNativePage(); } else { DisplayAlert("提示", "当前不是Android平台,无法打开Android原生页面", "确定"); } } private void BtnOpeniOS_OnClicked(object sender, EventArgs e) { if(Device.RuntimePlatform == Device.iOS) { DependencyService.Get<INativePageService>().OpeniOSNativePage(); } else { DisplayAlert("提示", "当前不是iOS平台,无法打开iOS原生页面", "确定"); } }
步骤2:Android平台实现
2.1 实现依赖服务接口
在Android项目中新建NativePageServiceDroid.cs文件:
using Android.Content; using Xamarin.Forms; // 注册依赖服务 [assembly: Dependency(typeof(YourAppNamespace.Droid.NativePageServiceDroid))] namespace YourAppNamespace.Droid { public class NativePageServiceDroid : INativePageService { public void OpenAndroidNativePage() { // 跳转至你创建的Android原生Activity var context = MainActivity.Instance; context.StartActivity(typeof(NativeAndroidActivity)); } public void OpeniOSNativePage() { // Android平台无需实现该方法 } } }
注意:YourAppNamespace替换为你自己项目的命名空间,NativeAndroidActivity是你提前在Android项目中创建的原生页面Activity
2.2 补充MainActivity配置
在Android项目的MainActivity.cs中添加静态实例变量,避免跳转时上下文为空:
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity { // 存储当前Activity实例 public static MainActivity Instance { get; private set; } protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); Instance = this; // 原有初始化代码保持不变 Xamarin.Essentials.Platform.Init(this, savedInstanceState); global::Xamarin.Forms.Forms.Init(this, savedInstanceState); LoadApplication(new App()); } }
步骤3:iOS平台实现
在iOS项目中新建NativePageServiceiOS.cs文件:
using UIKit; using Xamarin.Forms; // 注册依赖服务 [assembly: Dependency(typeof(YourAppNamespace.iOS.NativePageServiceiOS))] namespace YourAppNamespace.iOS { public class NativePageServiceiOS : INativePageService { public void OpenAndroidNativePage() { // iOS平台无需实现该方法 } public void OpeniOSNativePage() { // 跳转至你创建的iOS原生ViewController var rootVC = UIApplication.SharedApplication.KeyWindow.RootViewController; var nativePage = new NativeiOSViewController(); rootVC.PresentViewController(nativePage, true, null); // 如果你用了导航栈,也可以用rootVC.NavigationController.PushViewController(nativePage, true); } } }
注意:NativeiOSViewController是你提前在iOS项目中创建的原生页面ViewController
补充说明
- 原生页面的开发逻辑和纯原生Android、iOS开发完全一致,没有额外限制
- 需要从原生页面返回Forms页面时,Android直接调用Activity的
Finish()方法,iOS调用ViewController的DismissViewController(true, null)方法即可
内容的提问来源于stack exchange,提问作者SNR
相关产品推荐
相关产品推荐

