如何将OnActivityResult发送到xamarin表单中的特定页面

时间:2017-07-25 13:12:17

标签: events xamarin.android xamarin.forms renderer

我正在使用自定义按钮渲染器进行谷歌登录在xamarin表单页面工作正常我得到了注册结果MainActivity现在我想将此数据从MainActivity和AppDelegate发送到Xamarin Forms中的特定页面。

protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
        {
            base.OnActivityResult(requestCode, resultCode, data);

            if (requestCode == 9001)
            {
                Utilities.Configuration.UpdateConfigValue(Utilities.Constants.loggedInflag,string.Empty);
                GoogleSignInResult result = Android.Gms.Auth.Api.Auth.GoogleSignInApi.GetSignInResultFromIntent(data);

                if (result.IsSuccess)
                {

                    GoogleSignInAccount acct = result.SignInAccount;
                    var token = acct.IdToken;
                    //I wan to send the 'accnt' to a Page in xamarin forms

                }
                else
                {
                    //Signin Failure send response to Page in xamarin forms
                }
            }
        }

2 个答案:

答案 0 :(得分:1)

Xamarin表单在一个活动上运行,这与您的主要活动最相似。

有两个示例项目向您展示如何在代码的原生部分和表单部分之间进行通信,可在此处找到

  1. https://github.com/xamarin/xamarin-forms-samples/tree/master/Forms2Native
  2. https://github.com/xamarin/xamarin-forms-samples/tree/master/Native2Forms
  3. 但是,要回答您的问题,您可以执行以下操作

    private const int MyRequestCode = 101;
    
     //Start activity for result 
     var contactPickerIntent = new Intent(Intent.ActionPick, Android.Provider.ContactsContract.Contacts.ContentUri);
     context.StartActivityForResult(contactPickerIntent, MyRequestCode);
    

    然后在你的主要活动中(初始化你的xamarin表单应用程序的活动(使用global :: Xamarin.Forms.Forms.Init(this,bundle);)

    protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
    { 
        if (requestCode == MyRequestCode && resultCode == Result.Ok)
        { 
        } 
    }
    

答案 1 :(得分:0)

Xamarin.Forms仅在Android上的一个Activity中运行。因此,如果您的网址请求来自不同的活动,则必须切换回MainActivity才能使用普通的XF导航。

当用户打开与我的应用相关联的文件时,我会执行此操作。

[Activity(Label = "LaunchFileActivity")]
public class LaunchFileActivity : Activity
{
    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);

        if (Intent.Data != null)
        {
            var uri = Intent.Data;
            if (uri != null)
            {
                Intent i = new Intent(this, typeof(MainActivity));
                i.AddFlags(ActivityFlags.ReorderToFront);
                i.PutExtra("fileName", uri.Path);
                this.StartActivity(i);
            }
        }
        this.FinishActivity(0);
    }
}

在MainActivity中:

protected override void OnNewIntent(Intent intent)
{
    base.OnNewIntent(intent);
    Intent = intent;
}

protected override void OnPostResume()
{
    base.OnPostResume();
    if (Intent.Extras != null)
    {
        string fileName = Intent.Extras.GetString("fileName");
        if (!string.IsNullOrEmpty(fileName))
        {
            // do something with fileName
        }
        Intent.RemoveExtra("fileName");
    }
}