[英]Calling C# function from Javascript in Xamarin Forms PCL
I am developing a cross-platform app in c# using Xamarin Forms. 我正在使用Xamarin Forms在c#中开发一个跨平台应用程序。 I am new to xamarin.
我是xamarin的新手。 I have created a Portable Cross-Platform App.
我创建了一个便携式跨平台应用程序。 In which I am trying to open local html pages in webview.
我试图在其中打开Web视图中的本地html页面。 For Calling c# function from javascript I have implemented hybrid web view using XAMARIN FORUM .
为了从javascript调用c#函数,我已经使用XAMARIN FORUM实现了混合Web视图。
<ContentPage.Content>
<local:HybridWebView x:Name="hybridWebView" Uri="index.html" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand" />
</ContentPage.Content>
I am calling invokeCSharpAction()
which is in index.html. 我正在调用index.html中的
invokeCSharpAction()
。
In Droid Project 在Droid项目中
public class HybridWebViewRenderer : ViewRenderer<HybridWebView, Android.Webkit.WebView>
{
const string JavaScriptFunction = "function invokeCSharpAction(data){jsBridge.invokeAction(data);}";
protected override void OnElementChanged(ElementChangedEventArgs<HybridWebView> e)
{
base.OnElementChanged(e);
Android.Webkit.WebView.SetWebContentsDebuggingEnabled(true);
if (Control == null)
{
var webView = new Android.Webkit.WebView(Forms.Context);
webView.Settings.JavaScriptEnabled = true;
webView.Settings.DomStorageEnabled = true;
Android.Webkit.WebView.SetWebContentsDebuggingEnabled(true);
webView.SetWebChromeClient(new WebChromeClient());
webView.SetWebViewClient(new WebViewClient());
webView.AddJavascriptInterface(new JSBridge(this), "jsBridge");
SetNativeControl(webView);
}
if (e.OldElement != null)
{
Control.RemoveJavascriptInterface("jsBridge");
var hybridWebView = e.OldElement as HybridWebView;
hybridWebView.Cleanup();
}
if (e.NewElement != null)
{
Control.AddJavascriptInterface(new JSBridge(this), "jsBridge");
Control.LoadUrl(string.Format("file:///android_asset/Content/{0}", Element.Uri));
InjectJS(JavaScriptFunction);
}
}
void InjectJS(string script)
{
if (Control != null)
{
Control.LoadUrl(string.Format("javascript: {0}", script));
}
}
}
JSBridge.cs JSBridge.cs
public class JSBridge : Java.Lang.Object
{
readonly WeakReference<HybridWebViewRenderer> hybridWebViewRenderer;
public JSBridge(HybridWebViewRenderer hybridRenderer)
{
hybridWebViewRenderer = new WeakReference<HybridWebViewRenderer>(hybridRenderer);
}
[JavascriptInterface]
[Export("invokeAction")]
public void InvokeAction(String data)
{
HybridWebViewRenderer hybridRenderer;
if (hybridWebViewRenderer != null && hybridWebViewRenderer.TryGetTarget(out hybridRenderer))
{
hybridRenderer.Element.InvokeAction(data);
}
}
[JavascriptInterface]
[Export("invokeDownloadAction")]
public void invokeDownloadAction(String data)
{
HybridWebViewRenderer hybridRenderer;
if (hybridWebViewRenderer != null && hybridWebViewRenderer.TryGetTarget(out hybridRenderer))
{
// hybridRenderer.Element.InvokeAction(data);
hybridRenderer.Element.InvokeAction(data);
}
}
}
Suppose I navigated to home.html using window.location in index.html Now if I try to call same invokeCSharpAction()
,in output window VS says 假设我使用index.html中的window.location导航到home.html现在,如果我尝试在输出窗口中调用相同的
invokeCSharpAction()
,VS会说
invokeCSharpAction is not defined
未定义invokeCSharpAction
How can i handle this situation. 我该如何处理这种情况。 Can I have OnNavigated and OnNavigating Event for my hybrid webview?
我的混合webview是否可以具有OnNavigated和OnNavigating事件?
Refer this URL for Android IOS and UWP https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/custom-renderer/hybridwebview 请为Android IOS和UWP引用此URL https://docs.microsoft.com/zh-cn/xamarin/xamarin-forms/app-fundamentals/custom-renderer/hybridwebview
You can resolve the issue Easily 您可以轻松解决问题
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.