在Webview渲染器中处理自定义事件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Webview渲染器中处理自定义事件相关的知识,希望对你有一定的参考价值。

我正在尝试处理来自自定义Web视图的事件,但该事件根本没有触发,我将在此处放置一些代码

在我的PCL项目CustomWebview.cs中

namespace TesteNovo
{
    public class CustomWebview : WebView
    {
        public EventHandler<int> Test;
    }
}

在我的android项目CustomWebviewAndroid.cs中

[assembly: ExportRenderer(typeof(Android.Webkit.WebView),typeof(CustomWebviewAndroid))]
namespace TesteNovo.Droid
{

    public class CustomWebviewAndroid : Android.Webkit.WebView
    {
        public CustomWebviewAndroid(Context context) : base(context)
        {
            var cl = new CustomWebViewClient();
            cl.ErroTeste += (a, b) => {
                var t = new CustomWebview();
                t.Test?.Invoke(this, b);

            };

            SetWebViewClient(cl);

        }

    }
}

在我的Android项目CustomWebviewClient中

namespace TesteNovo.Droid
{
    public class CustomWebViewClient : WebViewClient
    {


        public EventHandler<int> ErroTeste;

        public override void OnReceivedError(WebView view, IWebResourceRequest request, WebResourceError error)
        {
            ErroTeste?.Invoke(this, 404);
            base.OnReceivedError(view, request, error);

        }

        public override void OnReceivedHttpError(WebView view, IWebResourceRequest request, WebResourceResponse errorResponse)
        {
            base.OnReceivedHttpError(view, request, errorResponse);
            ErroTeste?.Invoke(this, 404);
        }



    }
}

在我的PCL项目Mainpage.xaml中

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:d="http://xamarin.com/schemas/2014/forms/design"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:local="clr-namespace:TesteNovo;assembly=TesteNovo"
             mc:Ignorable="d"
             x:Class="TesteNovo.MainPage">

    <StackLayout>
        <!-- Place new controls here -->
        <local:CustomWebview   x:Name="teste1" Source="https://www.sincor.77seg.com.br/" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand" >

        </local:CustomWebview>

    </StackLayout>

</ContentPage>

在我的PCL MainPage.cs中

public partial class MainPage : ContentPage
{
    public MainPage()
    {
        InitializeComponent();

        teste1.Test += async (a, b) => {
            await DisplayAlert(b.ToString(), "teste", "OK");

        };
    }
}

第一个目标是当我收到来自http请求的任何错误时触发Test事件,下一个目标是选择哪种错误将触发Test事件。

如果您需要更多代码或详细信息,请在评论中告诉我。

答案

1。在MainThread中显示警报:

public MainPage()
{
    InitializeComponent();

    teste1.Test += async (a, b) => {

        Device.BeginInvokeOnMainThread(async () => {
            await DisplayAlert(b.ToString(), "teste", "OK");
        });
    };
}

2。您应该编写CustomWebview的渲染器而不是Android.Webkit.WebView

[assembly: ExportRenderer(typeof(CustomWebview),typeof(CustomWebviewAndroid))]
namespace App81.Droid
{

    public class CustomWebviewAndroid : ViewRenderer<CustomWebview, Android.Webkit.WebView> {

        Context _context;

        public CustomWebviewAndroid(Context context) : base(context)
        {

            _context = context;

        }
        protected override void OnElementChanged(ElementChangedEventArgs<CustomWebview> e)
        {
            base.OnElementChanged(e);

            if (e.NewElement != null)
            {
                if (Control == null)
                {
                    var webView = new Android.Webkit.WebView(_context);
                    webView.Settings.javascriptEnabled = true;

                    var cl = new CustomWebViewClient();
                    cl.ErroTeste += (a, b) => {
                        e.NewElement.Test?.Invoke(this, b);
                    };

                    webView.SetWebViewClient(cl);

                    SetNativeControl(webView);

                }

                Control.LoadUrl($"https://www.sincor.77seg.com.br/");
            }
        }
    }

    public class CustomWebViewClient : WebViewClient
    {


        public EventHandler<int> ErroTeste;

        public override void OnReceivedError(WebView view, IWebResourceRequest request, WebResourceError error)
        {
            ErroTeste?.Invoke(this, 404);
            base.OnReceivedError(view, request, error);

        }

        public override void OnReceivedHttpError(WebView view, IWebResourceRequest request, WebResourceResponse errorResponse)
        {
            base.OnReceivedHttpError(view, request, errorResponse);
            ErroTeste?.Invoke(this, 404);
        }
    }
}   

3。实现此目的的另一种方法是使用messaging-center,消息传递中心可以在xxx.Android项目和共享项目之间传递数据。

以上是关于在Webview渲染器中处理自定义事件的主要内容,如果未能解决你的问题,请参考以下文章

如何在片段着色器中进行自定义模板测试

跨webview触发自定义事件

在 Xamarin Forms 自定义标签渲染器中,增加边界的大小

有没有办法在片段着色器中使用先前渲染的结果?

如何在 Xamarin IOS 自定义渲染器中单击 UITextField Rightview 打开 UIPickerView

ag-grid:水平向后和向前滚动后,在自定义单元格渲染器中发现服务未定义