【问题标题】:Start an Android activity in Xamarin Forms?在 Xamarin Forms 中启动 Android 活动?
【发布时间】:2017-11-04 09:55:15
【问题描述】:

我正在尝试使用以下代码在我的应用程序中使用默认的 Android pdf 查看器查看托管的 PDF 文件

            var intent = new Intent(Intent.ActionView);

            intent.SetDataAndType(Uri.Parse("http://sample/url.pdf"), "application/pdf");
            intent.SetFlags(ActivityFlags.ClearTop);
            Android.Content.Context.StartActivity(intent);

我在 Native 项目中使用过这段代码,所以我知道它可以在 Android 活动中运行。对于 Xamarin Forms,我有没有办法从内容页面启动 Android 活动,反之亦然?

【问题讨论】:

    标签: xamarin.android xamarin.forms


    【解决方案1】:

    你可以使用DependencyService来实现这个功能:

    INativePages in PCL:

     public interface INativePages
    {
        void StartActivityInAndroid();
    }
    

    Xamarin.Android中实现接口:

    [assembly: Xamarin.Forms.Dependency(typeof(NativePages))]
    namespace PivotView.Droid
    {
        public class NativePages : INativePages
        {
            public NativePages()
            {
            }
    
            public void StartAc()
            {
                var intent = new Intent(Forms.Context, typeof(YourActivity));
                Forms.Context.StartActivity(intent);
            }
    
        }
    }
    

    在 PCL 中启动 Android Activity

        private void Button_Clicked(object sender, EventArgs e)
        {
            Xamarin.Forms.DependencyService.Register<INativePages>();
            DependencyService.Get<INativePages>().StartAc();
        }
    

    【讨论】:

    • 我有外部存储文件路径“/storage/emulated/0/Android/data/com.XYZ.projectName/file/Download/sample.pdf”。那么,如何从这个 URL 打开文件?
    • Forms.Context 在 2.5 版中已过时。
    • 为了上下文使用而不是Android.App.Application.Context
    • [assembly: Xamarin.Forms.Dependency(typeof(NativePages))] 装饰已经向依赖服务注册了接口,因此不需要明确地使用 Xamarin.Forms.DependencyService.Register&lt;INativePages&gt;();
    【解决方案2】:

    Forms.Context 现在已经过时了。 解决方法是在 Android 项目的 Main Activity 类中实例化当前上下文,如下所示:

    public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity 
    {
      public static Xamarin.Forms.Platform.Android.FormsAppCompatActivity Instance { get; private set; }
    
      protected override void OnCreate(Bundle bundle)
      {
            base.OnCreate(savedInstanceState);
    
            Xamarin.Essentials.Platform.Init(this, savedInstanceState);
            global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
    
            LoadApplication(new App());
            Instance = this;
      }
    

    并在 NativePages StartAc() 方法中检索本地上下文,如下所示:

    public void StartAc()
        {
          var intent = new Intent(MainActivity.Instance, typeof(YourActivity));
          MainActivity.Instance.StartActivity(intent);
        }
    

    【讨论】:

      【解决方案3】:

      在一个android项目中为这个函数创建一个类:

      public class PdfLauncher : IPdfLauncher
      {
          public void LaunchPdf(string url)
          {
              //implementation
          }
      }
      

      在可移植项目中创建接口

      public interface IPdfLauncher
      {
          void LaunchPdf(string url);
      }
      

      为您的视图模型添加一个属性,以便您可以从便携式项目中调用该函数

      public IPdfLauncher PdfLauncher {get;set;}
      

      将接口添加到您的 viewmodel 构造函数并传入您在 android 主 Activity 中创建的实例。您现在可以从 xforms 命令调用 android 代码,如果您添加了 iOS 或 UWP,您可以简单地在这些项目中实现该接口并在运行时传递它们。我使用 MVVM 的注入框架来自动创建这些特定于平台的实现,如果你发现自己经常这样做,我建议你研究一下。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-02
        • 1970-01-01
        • 2020-02-05
        相关资源
        最近更新 更多