xamarin.forms - 如何在 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);
}
解决方案
您可以使用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() 。
推荐阅读
- java - 添加一个字段并使用 Javassist 更改其值
- go - 如何在当前时间添加或减少 UTC 偏移值
- angular - Angular 会自动重新发送失败的 http 请求 3 次以上 - 为什么?
- swift - 结构数组上的过滤/搜索功能,以在 tableView 中显示
- git - 如何重置 git 忽略的文件(未在 .gitignore 中配置)?
- sql - 如何从表中选择所有列以及当前日期和时间?
- c# - 使用 Oracle 18 客户端连接 MSDAORA 的问题
- python - 如何在 kivy 开发的安卓应用中使用 python 模块?
- node.js - 用于自动导出全局变量的 VS Code Intellisense
- java - Mockito.when give InvalidUseOfMatchersException: Misplaced or misused argument matcher detected here