一旦调用SetWebViewClient

时间:2019-05-25 07:21:20

标签: xamarin xamarin.android android-webview

我有一个简单的Web视图,正在加载一些本地存储的HTML。 HTML中有普通的香草链接,例如<a href="https://google.com"/>。当用户点击这些链接之一时,我希望打开设备浏览器。

这是Android网络视图的默认行为,并且似乎可以正常工作,但是,一旦我调用webView.SetWebViewClient(webViewClient)方法,该默认行为就会停止。

我尝试在实现ShouldOverrideUrlLoading()类的过程中重写WebViewClient方法来自己打开浏览器,但是这些方法从未被调用。

总结一下,我的HTML中的链接将在浏览器中打开:

webView = new WebView(Activity);

//var webViewClient = new WebViewClient();
//webView.SetWebViewClient(webViewClient);

webView.LoadData(myHTML, "text/html", null);

但是,只要我取消注释这两行,链接就会在WebView中打开。

1 个答案:

答案 0 :(得分:0)

我不确定为什么没有在您的类中调用您的ShouldOverrideUrlLoading方法,因为我没有看完所有代码。因此,我整理了一个完整的示例,您可以在其中控制链接的打开方式(无论是在Webview视图中还是在其他Android浏览器活动中)。希望对您有所帮助!

WebView.axml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/WebView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/transparent">
    <WebView
        android:id="@+id/webviewMain"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#FFFFFF" />
</LinearLayout>

testwebview.html (项目中的“ Assets / html / testwebview.html”)

<html>
<head>
    <title>WebView Testing</title>
</head>
<body>
    <h1>Select a link...</h1>
    <br />
    <a href="https://www.google.com">Google</a>
    <br />
    <a href="https://stackoverflow.com">Stack Overflow</a>
</body>
</html>

WebViewCustomOverrideActivity.cs

using Android.App;
using Android.OS;
using Android.Webkit;
using Android.Content;

namespace XamdroidMaster.Activities {

    [Activity(Label = "Custom WebView Testing", MainLauncher = true)]
    public class WebViewCustomOverrideActivity : Activity {

        protected override void OnCreate(Bundle savedInstanceState) {
            base.OnCreate(savedInstanceState);

            SetContentView(Resource.Layout.WebView);
            WebView wv = FindViewById<WebView>(Resource.Id.webviewMain);

            MyWebViewClient myWebViewClient = new MyWebViewClient();
            wv.SetWebViewClient(myWebViewClient);

            wv.LoadUrl("file:///android_asset/html/testwebview.html");  // "Assets/html/testwebview.html" in project
        }

    }

    public class MyWebViewClient : WebViewClient {

        public override bool ShouldOverrideUrlLoading(WebView view, string url) {

            if (url.ToLower().Contains("google.com")) {
                // Let my WebView load the page
                return false;
            }

            // For all other links, launch another Activity that handles URLs
            var intent = new Intent(Intent.ActionView, Android.Net.Uri.Parse(url));
            view.Context.StartActivity(intent);
            return true;

        }

    }

}