2017-03-17 25 views
0

こんにちは私はxamarinのフォームpclプロジェクトでハイブリッドwebviewを実装しました。私はmailtoリンクを作成したhtmlページを持っていますが、それをクリックしても機能していないので、Webページが見つかりません。Xamarinはハイブリッドウェブを見ていますmailto link not working

uwpでは、アプリを起動するよう求めています。 Droid-

public class HybridWebViewRenderer : ViewRenderer<HybridWebView, Android.Webkit.WebView> 
    { 
     const string JavaScriptFunction = "function invokeCSharpAction(data){jsBridge.invokeAction(data);}"; 
     const string downloadFunction = "function downloadbook(data){jsBridge.invokeDownloadAction(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; 

       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)); 
       //string url = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal), Element.Uri); 
       //Control.LoadUrl(string.Format("file://{0}", url)); 

       Task.Run(() => { 
        Task.WaitAny(Task.Delay(2000)); 
        InjectJS(JavaScriptFunction); 
        CallJS(); 
       }); 

      } 
     } 

     void InjectJS(string script) 
     { 
      if (Control != null) 
      {     
       Control.LoadUrl(string.Format("Javascript: {0}", script)); 
      } 
     } 

     void CallJS() 
     { 
      if (Control != null) 
      { 
       try 
       { 

       } 
       catch (Exception ex) 
       { } 

      } 
     } 

    } 

答えて

0

Hybridwebview

public class HybridWebView : View 
    { 
     Action<string> action; 

     public static readonly BindableProperty UriProperty = BindableProperty.Create(
      propertyName: "Uri", 
      returnType: typeof(string), 
      declaringType: typeof(HybridWebView), 
      defaultValue: default(string)); 

     public string Uri 
     { 
      get { return (string)GetValue(UriProperty); } 
      set { SetValue(UriProperty, value); } 
     } 

     public void RegisterAction(Action<string> callback) 
     { 
      action = callback; 
     } 

     public void Cleanup() 
     { 
      action = null; 
     } 

     public void InvokeAction(string data) 
     { 
      if (action == null || data == null) 
      { 
       return; 
      } 
      action.Invoke(data); 
     } 
    } 

レンダラは、あなたはWebViewOnNavigatingイベントをサブスクライブし、そこのmailtoリンクを処理する必要があります。

void OnNavigating(object sender, WebNavigatingEventArgs e) 
{ 
    if (e.Url.StartsWith ("mailto")) { 
     Device.OpenUri(new Uri(e.Url);); 
     e.Cancel = true; 
    } 
} 

アプリの外に移動しているので、それは、ナビゲーションをキャンセルすることが重要ですし、任意の更なる移動しようとするWebViewのための必要はありません。

+0

ハイブリッドウェブビュー – Sonali

+0

@Sonaliにナビゲート中のイベントはありません。「ナビゲーションイベント」(https://developer.xamarin.com/api/event/Xamarin.Forms.WebView.Navigating/) WebView'。 –

+0

@Grace Feng - MSFTどうですか?実際に私はxamarinを初めて使っています。だからどこでこのイベントを購読できますか? – Sonali

0

mine webviewはハイブリッドです。今回はコードを追加しました。

は、私はあなたが WebViewのイベントをサブスクライブすることはできません、 View、Xamainrフォームのではない WebViewからあなた HybridWebView継承しているので、あなたの問題を発見しました。

public class HybridWebView : WebView 

この方法を使用する場合は、あなたのHybridWebViewRendererControlAndroid.Webkit.WebViewを意味し、その後、あなたが作成する必要はありません:あなたの問題を解決する1つの方法は、あなたがWebViewを継承するためにあなたのHybridWebViewクラスを変更することができるということです新しいもの。

イベントはPCLで購読する必要がありますが、Androidプロジェクトでこの作業を行う場合は、WebViewClientを実装してShouldOverrideUrlLoadingイベントを上書きすることもできます。