我正在嘗試實施此解決方案作為此處的答案:Opening target="_blank" links with Xamarin.Forms WebView
在Android 專案中,我創建了一個自定義渲染器,其中包含以下代碼摘錄:
[assembly: ExportRenderer(typeof(HybridWebView), typeof(MyApp.controls.HybridWebViewRenderer))]
public class HybridWebViewRenderer : WebViewRenderer
{
protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.WebView> e)
{
base.OnElementChanged(e);
Control.Settings.SetSupportMultipleWindows(true);
}
}
在我的共享專案中,我創建了一個HybridWebView其中包含以下代碼摘錄的代碼:
public class HybridWebView : WebView
{
public override bool OnCreateWindow(Android.Webkit.WebView view, bool isDialog, bool isUserGesture, Android.OS.Message resultMsg)
{
Android.Webkit.WebView newWebView = new Android.Webkit.WebView(_context);
view.AddView(newWebView);
Android.Webkit.WebView.WebViewTransport transport = (Android.Webkit.WebView.WebViewTransport)resultMsg.Obj;
transport.WebView = newWebView;
resultMsg.SendToTarget();
return true;
}
}
這會導致以下錯誤:
CS0115 'HybridWebViewRenderer.OnCreateWindow(WebView, bool, bool, Message)': no suitable method found to override
知道如何克服這個問題嗎?
uj5u.com熱心網友回復:
就我而言,我們不需要覆寫目標專案中自定義渲染器中的 OnCreateWindow。另外,請注意自定義 Webview 中的OnElementChanged方法。我們需要將SetSupportMultipleWindows設定為true,啟用 JS,設定 SetWebChromeClient,設定WebViewClient,設定 AddJSInterface,最后但同樣重要的是,為 webview 設定 LoadUrl。
以下是供您參考的代碼片段:
[assembly: ExportRenderer(typeof(HybridWebView),
typeof(HybridWebViewRenderer))]
namespace AppHybridWebView.Droid
{
public class HybridWebViewRenderer : WebViewRenderer
{
public HybridWebViewRenderer(Context context) : base(context)
{
_context = context;
}
protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.WebView> e)
{
base.OnElementChanged(e);
if (Control != null)
{
Control.Settings.SetSupportMultipleWindows(false);
Control.Settings.JavaScriptEnabled = true;
Control.SetWebChromeClient(new MyWebChromeClient());
Control.SetWebViewClient(new JavascriptWebViewClient(this, $"javascript: {JavascriptFunction}"));
Control.AddJavascriptInterface(new JSBridge(this), "jsBridge");
Control.LoadUrl($"file:///android_asset/Content/{((HybridWebView)Element).Uri}");//LoadUrl
}
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
((HybridWebView)Element).Cleanup();
}
base.Dispose(disposing);
}
}
public class MyWebChromeClient : WebChromeClient
{
public override bool OnCreateWindow(Android.Webkit.WebView view, bool isDialog, bool isUserGesture, Message resultMsg)
{
if (!isDialog)
{
return true;
}
return base.OnCreateWindow(view, isDialog, isUserGesture, resultMsg);
}
}
}
xaml 中的代碼:
<local:HybridWebView x:Name="hybridWebView" Uri="index.html" />
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/446869.html
標籤:xamarin xamarin.forms 网页浏览 android-webview 自定义渲染器
