调用SetWebViewClient后,Xamarin Android WebView不会在浏览器中打开链接
我有一个简单的webview,它正在加载一些本地存储的HTML。HTML中有普通的链接,如调用SetWebViewClient后,Xamarin Android WebView不会在浏览器中打开链接,xamarin,xamarin.android,android-webview,Xamarin,Xamarin.android,Android Webview,我有一个简单的webview,它正在加载一些本地存储的HTML。HTML中有普通的链接,如。当用户点击其中一个链接时,我希望设备浏览器打开 这是Android webview的默认行为,似乎工作正常,但只要调用webview.SetWebViewClient(webViewClient)方法,此默认行为就会停止 在我实现的WebViewClient类中,我尝试重写ShouldOverrideUrlLoading()方法以自己打开浏览器,但这些方法从未被调用 总而言之,我的HTML中的链接将在浏览
。当用户点击其中一个链接时,我希望设备浏览器打开
这是Android webview的默认行为,似乎工作正常,但只要调用webview.SetWebViewClient(webViewClient)
方法,此默认行为就会停止
在我实现的WebViewClient
类中,我尝试重写ShouldOverrideUrlLoading()
方法以自己打开浏览器,但这些方法从未被调用
总而言之,我的HTML中的链接将在浏览器中打开:
webView = new WebView(Activity);
//var webViewClient = new WebViewClient();
//webView.SetWebViewClient(webViewClient);
webView.LoadData(myHTML, "text/html", null);
但是一旦我取消注释这两行,链接就会在WebView中打开。我不确定为什么您的类中没有调用您的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”)
网络视图测试
选择一个链接。。。
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;
}
}
}
使用Android.App;
使用Android.OS;
使用Android.Webkit;
使用Android.Content;
命名空间XamdroidMaster.Activities{
[活动(Label=“自定义WebView测试”,MainLauncher=true)]
公共类WebViewCustomOverrideActivity:活动{
创建时受保护的覆盖无效(Bundle savedInstanceState){
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.WebView);
WebView wv=findviewbyd(Resource.Id.webviewMain);
MyWebViewClient MyWebViewClient=新建MyWebViewClient();
wv.SetWebViewClient(myWebViewClient);
wv.LoadUrl(“file:///android_asset/html/testwebview.html“”;/“项目中的资产/html/testwebview.html”
}
}
公共类MyWebViewClient:WebViewClient{
公共重写bool ShouldOverrideUrlLoading(WebView视图,字符串url){
如果(url.ToLower().Contains(“google.com”)){
//让我的WebView加载页面
返回false;
}
//对于所有其他链接,启动另一个处理URL的活动
var intent=newintent(intent.ActionView,Android.Net.Uri.Parse(url));
视图、上下文、起始触觉(意图);
返回true;
}
}
}
我不知道为什么您的类中没有调用您的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”)
网络视图测试
选择一个链接。。。
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;
}
}
}
使用Android.App;
使用Android.OS;
使用Android.Webkit;
使用Android.Content;
命名空间XamdroidMaster.Activities{
[活动(Label=“自定义WebView测试”,MainLauncher=true)]
公共类WebViewCustomOverrideActivity:活动{
创建时受保护的覆盖无效(Bundle savedInstanceState){
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.WebView);
WebView wv=findviewbyd(Resource.Id.webviewMain);
MyWebViewClient MyWebViewClient=新建MyWebViewClient();
wv.SetWebViewClient(myWebViewClient);
wv.LoadUrl(“file:///android_asset/html/testwebview.html“”;/“项目中的资产/html/testwebview.html”
}
}
公共类MyWebViewClient:WebViewClient{
公共重写bool ShouldOverrideUrlLoading(WebView视图,字符串url){
如果(url.ToLower().Contains(“google.com”)){
//让我的WebView加载页面
返回false;
}
//对于所有其他链接,启动另一个处理URL的活动
var intent=newintent(intent.ActionView,Android.Net.Uri.Parse(url));
视图、上下文、起始触觉(意图);
返回true;
}
}
}