我正在创建一个渲染器,以便从Xamarin.Forms应用程序中打开本机Android Activity。在我的渲染器中,我有;
public class CaptureBarcodeRenderer : PageRenderer
{
private Activity _activity;
protected override void OnElementChanged(ElementChangedEventArgs<Page> e)
{
base.OnElementChanged(e);
_activity = Context as Activity;
Intent intent = new Intent(_activity, typeof(CaptureBarcode));
_activity.StartActivityForResult(intent, 0);
//activity.StartActivity(intent);
}
}
我使用xamarin-forms-samples中的示例来执行此操作。从活动I推出中可以明显看出,我正在捕获条形码。不幸的是,我无法通知打开此活动的页面已捕获条形码。如果我可以使用结果,我可以通知调用页面(因为我可以访问此处)我们已经扫描过,然后从那里调用PopAsync()。
因为调用页面是ContentPage,所以我无法将其作为intent中数据的一部分传递,因为它不可序列化。
问题 如何在Context上存在OnActivityResult并且我无法覆盖该方法或订阅事件。
我想打开结果的活动,当我得到活动结果时,我想要关闭我已启动的条形码活动并将页面弹出导航堆栈。
任何帮助?
答案 0 :(得分:2)
我确实有这个工作,但我对它的成功并不是真的很高兴。
在我的MainActivity类中,我创建了一个表示表单一侧页面的静态属性(BarcodeView)。在我的自定义渲染器中,我将此变量设置为e.NewProperty值。
在我的MainActivity中,我重写了OnActivityResult
protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
{
base.OnActivityResult(requestCode, resultCode, data);
if (resultCode == Result.Ok)
BarcodeView.DoScan(data.GetStringExtra("code"));
}
现在,当我扫描时,这个方法被击中了。在扫描活动中,我完成()视图,然后当我得到我的DoScan()时,弹出导航以摆脱自定义渲染器视图。
答案 1 :(得分:1)
我自己也遇到了这个问题,谢谢你发布你的答案。它对我帮助很大。我做了一个小小的改动,因为在我的情况下,我需要其他页面来取回活动结果。在MainActivity.cs中,我添加了这个:
public class ActivityResultEventArgs : EventArgs
{
public int RequestCode { get; set; }
public Result ResultCode { get; set; }
public Intent Data { get; set; }
public ActivityResultEventArgs() : base()
{}
}
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsApplicationActivity
{
public event EventHandler<ActivityResultEventArgs> ActivityResult = delegate {};
protected override void OnCreate (Bundle bundle)
{
base.OnCreate (bundle);
global::Xamarin.Forms.Forms.Init (this, bundle);
LoadApplication (new App ());
}
protected override void OnActivityResult (int requestCode, Result resultCode, Intent data) {
ActivityResult (this, new ActivityResultEventArgs {
RequestCode = requestCode,
ResultCode = resultCode,
Data = data
});
}
}
然后每个PageRender都可以从事件中得到结果:
protected override void OnElementChanged (ElementChangedEventArgs<Page> e)
{
base.OnElementChanged (e);
var activity = this.Context as MainActivity;
if (e.OldElement != null)
{
activity.ActivityResult -= HandleActivityResult;
}
if (e.NewElement != null)
{
activity.ActivityResult += HandleActivityResult;
}
}
private void HandleActivityResult(object sender, ActivityResultEventArgs e)
{
Console.WriteLine (string.Format ("Activity result is {0}", e.ResultCode));
}