无法覆盖Renderer的OnActivityResult

时间:2014-08-10 12:58:36

标签: android-intent android-activity xamarin

我正在创建一个渲染器,以便从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并且我无法覆盖该方法或订阅事件。

我想打开结果的活动,当我得到活动结果时,我想要关闭我已启动的条形码活动并将页面弹出导航堆栈。

任何帮助?

2 个答案:

答案 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));
    }