首页 > 解决方案 > 如何在 webview 中实现点击手势以显示 html 而不是网站

问题描述

我需要我的 web 视图可以点击和滚动。一旦我实现触摸滚动就不起作用。这样我设法让它工作,但现在我不知道如何使 web 视图可点击?ButtonPress 什么都不做,如果我使用 Move,那么我只是在滚动

这是我在 mu droid 项目中的渲染

class ExtendedWebViewClient : WebViewClient
        {
            WebView _webView;
 
            public async override void OnPageFinished(WebView view, string url)
            {
                try
                {
                    _webView = view;
                    if (_xwebView != null)
                    {

                        view.Settings.JavaScriptEnabled = true;
                        await Task.Delay(100);
                        string result = await _xwebView.EvaluateJavaScriptAsync("(function(){return document.body.scrollHeight;})()");
                        _xwebView.HeightRequest = Convert.ToDouble(result);
                    }
                    base.OnPageFinished(view, url);
                }
                catch (Exception ex)
                {
                    Console.WriteLine($"{ex.Message}");
                }
            }
            public override bool ShouldOverrideUrlLoading(Android.Webkit.WebView view, IWebResourceRequest request)
            {
                return true;
            }
        }

        protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.WebView> e)
        {
            base.OnElementChanged(e);
            _xwebView = e.NewElement as ExtendedWebView;
            _webView = Control;

            if (e.OldElement == null)
            {
                _webView.SetWebViewClient(new ExtendedWebViewClient());
            }

            if (e.OldElement != null)
            {
                Control.Touch -= ControlOnTouch;
                Control.ScrollChange -= ControlOnScrollChange;
            }

            if (e.NewElement != null)
            {
                Control.Touch += ControlOnTouch;
                Control.ScrollChange += ControlOnScrollChange;
            }
        }

        private void ControlOnScrollChange(object sender, ScrollChangeEventArgs scrollChangeEventArgs)
        {
            if (scrollChangeEventArgs.ScrollY > 0 && scrollChangeEventArgs.OldScrollY == 0)
            {
                Control.Parent.RequestDisallowInterceptTouchEvent(true);
            }
        }

        private void ControlOnTouch(object sender, Android.Views.View.TouchEventArgs e)
        {
            // Executing this will prevent the Scrolling to be intercepted by parent views
            switch (e.Event.Action)
            {
                case MotionEventActions.Down:
                    Control.Parent.RequestDisallowInterceptTouchEvent(true);
                    break;
                case MotionEventActions.Up:
                    Control.Parent.RequestDisallowInterceptTouchEvent(false);
                    break;
                case MotionEventActions.ButtonPress:
                    Console.WriteLine("press");
                    break;
                case MotionEventActions.Mask:
                    Console.WriteLine("mask");
                    break;
            }
            // Calling this will allow the scrolling event to be executed in the WebView
            Control.OnTouchEvent(e.Event);
        }

标签: xamarin.forms

解决方案


您可以使用Focused事件,而不是在 webview 上使用手势识别器,如下所示。当您点击WebView时,它将被调用。

var wb = new WebView
{
    HorizontalOptions = LayoutOptions.FillAndExpand,
    VerticalOptions = LayoutOptions.FillAndExpand,
    Source = "xxx",
};

wb.Focused += (sender, event) =>
{
   
   //Handle your logic here!
   wb.Unfocus();
 };

如果您想在每次点击 web 视图时实现逻辑,则使用Unfocus() 。


推荐阅读