В Xamarin.Android необходимо использовать Activity по вызову из Xamarin.Forms с использованием DependencyService

Я реализую вручную https://developers.google.com/pay/api/android/guides/tutorial в Xamarin.Forms + Xamarin.Android. Я звоню в Xamarin.Forms:

DependencyService.Get<IPay>().Pay();

В Xamarin.Android я реализую

public class Pay_Droid : IPay
{

public void Pay()
{
...
AutoResolveHelper.ResolveTask(
                paymentsClient.LoadPaymentData(request),
                this,
                LOAD_PAYMENT_DATA_REQUEST_CODE);
...
}

}

но есть проблема в "этом" - нужно использовать активность. Как реализовать?


person Sergey Shamanayev    schedule 08.10.2019    source источник


Ответы (3)


Во-первых, вы можете создать общедоступную статическую MainActivity в классе MainActivity, а затем назначить текущую MainActivity для macvivity в методе MainActivity OnCreate():

public static MainActivity macvivity;
    protected override void OnCreate(Bundle savedInstanceState)
    {
        TabLayoutResource = Resource.Layout.Tabbar;
        ToolbarResource = Resource.Layout.Toolbar;

        base.OnCreate(savedInstanceState);


        macvivity = this;

        global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
        LoadApplication(new App());
    }

Наконец, вы можете активировать MainActivity.macvivity.

public void Pay()
{
...
AutoResolveHelper.ResolveTask(
            paymentsClient.LoadPaymentData(request),
            MainActivity.macvivity,
            LOAD_PAYMENT_DATA_REQUEST_CODE);
...
}
person Cherry Bu - MSFT    schedule 09.10.2019
comment
Вы проверяли, не вызывает ли это утечку памяти? В родном Android (Java) сохранение статической ссылки на контекст приведет к утечке памяти. - person Mira_Cole; 05.05.2021

Как видно из некоторых примеров, предоставленных Xamarin на Github, вы можете просто использовать "Context" вашего приложения, как показано ниже внутри вашего Pay_Droid класс следующим образом:

Context _context;

public Pay_Droid(Context context) : base(context)
{
    _context = context;
}

public void Pay()
{
    ...
    AutoResolveHelper.ResolveTask(paymentsClient.LoadPaymentData(request), _context, LOAD_PAYMENT_DATA_REQUEST_CODE);
    ...
}
person Saamer    schedule 08.10.2019

Для Xamarin вы можете использовать:

public void Pay() => AutoResolveHelper.ResolveTask(
                    PaymentsClient.LoadPaymentData(request),
                    Platform.CurrentActivity,
                    LOAD_PAYMENT_DATA_REQUEST_CODE);
person Justin Wright    schedule 11.02.2021