【问题标题】:Webview does not close after leaving the page in Xamarin.Forms Application离开 Xamarin.Forms 应用程序中的页面后,Webview 不关闭
【发布时间】:2018-06-06 12:06:15
【问题描述】:

在我离开 webview 页面后,我花了很多时间试图弄清楚如何阻止 webview 处于活动状态。我发现这一点的原因是 Google Play 商店拒绝了该应用程序,因为该应用程序违反了 youtube 的条款和服务。这是因为即使离开页面,youtube 视频也会在后台继续播放。我正在使用 xamarin.forms 在 .cs 文件中创建 webview(见下文)。下面的代码是我在应用程序内显示 youtube 视频频道的方式。目前跨平台运行:ios/android。

尝试过的解决方案

我曾尝试研究以下解决方案,例如 onPause() 解决方案:

@Override
protected void onPause() {
    mWebView.onPause();
    super.onPause();
}

但是,xamarin 网络视图无权访问 OnPause()。

我也看过

Webview.loadUrl("about:blank"); 

但我不确定如何将其合并到应用程序中,以便在应用程序移出 webview 页面时执行。

当前代码

public partial class YoutubePage : ContentPage
{
    public YoutubePage ()
    {
        InitializeComponent();
        WebView webView = new WebView
        {
            Source = new UrlWebViewSource
            {
                Url = "https://www.youtube.com/",
            },
            VerticalOptions = LayoutOptions.FillAndExpand
        };

        this.Content = new StackLayout
        {
            Children =
            {
                webView
            }
        };
    }
}

【问题讨论】:

  • 使用页面的 OnDisappearing 方法
  • 早已不复存在,但只是想知道,一个快速简单的解决方法是在离开/关闭 web 视图页面之前加载另一个 URL?类似于:webView.Source = "google.com";

标签: xamarin webview youtube xamarin.forms xamarin.android


【解决方案1】:

使用OnDisappearing 生命周期事件将您的 WebView 设置为空白页:

protected override void OnDisappearing()
{
    webView.Source = "about:page";
    base.OnDisappearing();
}

使用 OnAppearing 生命周期事件将 WebView 的源设置回原始内容:

protected override void OnAppearing()
{
    base.OnAppearing();
    webView.Source = "https://youtube.com";
}

这当然会破坏用户体验,如果您希望暂停/恢复 Android.WebKit.WebView,您可以继承 WebViewWebViewRender 以添加该功能。

PausableWebView

界面:

public interface IPausableWebViewRenderer
{
    void Pause();
    void Resume();
}

Xamarin.FormsPausableWebView:

public class PausableWebView : WebView
{
    public IPausableWebViewRenderer Renderer;

    public void Pause()
    {
        if (renderer != null) renderer.Pause();
    }

    public void Resume()
    {
        if (renderer != null) renderer.Resume();
    }
}

Xamarin.AndroidPausableWebViewRenderer:

public class PausableWebViewRenderer : WebViewRenderer, IPausableWebViewRenderer
{
    Android.Webkit.WebView webView;

    public PausableWebViewRenderer(Android.Content.Context context) : base(context) { }

    protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.WebView> e)
    {
        base.OnElementChanged(e);

        webView = Control;
        if (e.OldElement != null)
            (e.OldElement as PausableWebView).Renderer = null;
        if (e.NewElement != null)
            (e.NewElement as PausableWebView).Renderer = this;
    }

    public void Pause()
    {
        if (webView != null) webView.OnPause();
    }

    public void Resume()
    {
        if (webView != null) webView.OnResume();
    }
}

示例:

XAML:

<local:PausableWebView x:Name="webView" Source="https://youtube.com" VerticalOptions="FillAndExpand" HorizontalOptions="FillAndExpand" />

OnDisappearing/OnAppearing:

protected override void OnDisappearing()
{
    webView.Pause();
    base.OnDisappearing();
}

protected override void OnAppearing()
{
    base.OnAppearing();
    webView.Resume();
}

【讨论】:

  • iOS 有类似的东西吗?
猜你喜欢
  • 1970-01-01
  • 2013-09-17
  • 1970-01-01
  • 2012-06-13
  • 1970-01-01
  • 2012-11-03
  • 1970-01-01
  • 2020-07-01
  • 1970-01-01
相关资源
最近更新 更多