Xamarin Android WebView не открывает ссылки в браузере после вызова SetWebViewClient - PullRequest
1 голос
/ 25 мая 2019

У меня есть простое веб-представление, которое загружает локально сохраненный 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 голосов
/ 25 мая 2019

Я не уверен, почему ваш метод ShouldOverrideUrlLoading не вызывается в вашем классе, так как у меня нет всего вашего кода для просмотра. Итак, я собрал полностью рабочий пример, в котором вы можете контролировать, как открываются ссылки - в представлении веб-просмотра или в другом браузере 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 («Активы / 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;

        }

    }

}
...