Device.OpenUri открывает две вкладки в браузере при использовании в методе OnAppearing страницы - PullRequest
0 голосов
/ 14 мая 2018

Когда я открываю встроенный браузер Android по умолчанию, он открывает две вкладки вместо одной. У меня есть MainPage и Page1. В MainPage у меня есть кнопка, которая направляет пользователя на Page1.

Page1.xaml не имеет ничего особенного, поскольку это шаблон XAML по умолчанию. Page1.xaml.cs:

public partial class Page1 : ContentPage
{
    public Page1 ()
    {
        InitializeComponent ();
    }

    protected override void OnAppearing()
    {
        base.OnAppearing();
        Device.OpenUri(new Uri("https://stackoverflow.com"));
    }
}

Проблема: Когда я вхожу на страницу Page1, браузер Android по умолчанию (т. Е. Google Chrome) открывает две вкладки веб-сайта https://stackoverflow.com вместо одной.

Обновление: Когда я отлаживал, я заметил, что эта проблема возникает, только если мы используем Device.OpenUri в OnAppearing () метод, поскольку это не будет происходит, если используется в конструкторе.

Обновление: Я пытался использовать нативный (например, Android) механизм через DependancyService, но это тоже не сработало:

var uri = Android.Net.Uri.Parse("https://stackoverflow.com");
                var intent = new Intent(Intent.ActionView, uri );
                intent.SetFlags(ActivityFlags.NewTask);
                Application.Context.StartActivity(intent);

Так что я думаю, что эта проблема должна быть со стороны Android, а не Xamarin.Forms.

Обновление: Странно, если я поставлю задержку перед открытием браузера, как в коде ниже, проблема больше не возникает:

protected override async void OnAppearing()
{
    base.OnAppearing();

    await Task.Delay(500);
    Device.OpenUri(new Uri("https://stackoverflow.com"));
}

Хотя это может быть временное решение этой проблемы, я надеюсь, однако, кто-то найдет решение для этой проблемы.

1 Ответ

0 голосов
/ 15 мая 2018

Когда я вхожу на страницу Page1, браузер Android по умолчанию (т. Е. Google Chrome) открывает две вкладки веб-сайта https://stackoverflow.com вместо одной.

Я думаю, что причинав том, что OnAppearing() снова срабатывает после вызова Device.OpenUri().Он должен быть вызван, когда вы вернетесь из браузера, но он вызывается раньше.Браузер показал и Page1 OnDisappearing() выстрелил.После этого запускается второй OnAppearing().

В вашем обходном пути второй OnAppearing() будет запущен, когда вы вернетесь из браузера.но он снова откроет URI.

Я думаю, вам следует переместить код в другие места, например button_Clicked или Page1 ().Например:

public Page1 ()
{
    InitializeComponent ();
    Device.OpenUri(new Uri("https://stackoverflow.com"));
}
...