我正在尝试使用以下代码在我的应用中使用默认的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活动,反之亦然?
答案 0 :(得分:10)
您可以使用DependencyService来实现此功能:
INativePages
中的 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();
}
答案 1 :(得分:0)
在android项目中为此函数创建一个类:
public class PdfLauncher : IPdfLauncher
{
public void LaunchPdf(string url)
{
//implementation
}
}
在便携式项目中创建界面
public interface IPdfLauncher
{
void LaunchPdf(string url);
}
向viewmodel添加属性,以便可以从便携式项目中调用该函数
public IPdfLauncher PdfLauncher {get;set;}
将接口添加到viewmodel构造函数并传入您在android主活动中创建的实例。您现在可以从xforms命令调用android代码,如果您添加iOS或UWP,您可以在这些项目中简单地实现该接口并在运行时传递它们。我使用MVVM中的注入框架来自动创建这些特定于平台的实现,如果您发现自己经常这样做,我建议您进行调查。
答案 2 :(得分:0)
Forms.Context现在已过时。 解决方法是实例化Android项目的Main活动类中的当前上下文,如下所示:
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);
}