Xamarin Android Webview 文本选择不适用于自定义上下文菜单
Xamarin Android Webview text selection is not working with Custom context menu
Xamarin Android Webview 不允许 select 当 OnCreateContextMenu 被覆盖以将新菜单项放入上下文菜单时的文本。
此外,它不显示默认菜单。因此,我们希望在添加新菜单时保留现有的默认菜单,如复制、Select 全部等。
protected override void OnCreateContextMenu(Android.Views.IContextMenu menu)
{
base.OnCreateContextMenu(menu);
var item = menu.Add("Add To Notes");
item.SetOnMenuItemClickListener(this);
}
we want to retain the existing default menus like Copy, Select All, etc. as well when we are adding the new menu.
您可以覆盖 onActionModeStarted
方法以在默认 Menu
上添加新菜单。覆盖此方法,您可以通知 Activity
已启动操作模式。这是我的代码,它运行良好:
WebView view = FindViewById<WebView>(Resource.Id.web);
view.Settings.JavaScriptEnabled = true;
view.SetWebViewClient(new MyWebViewClient());
view.LoadUrl("https://www.google.com.sg/?gfe_rd=cr&ei=gFDGWIjIH8LB9AXbwY3QDg");
public class MyWebViewClient : WebViewClient
{
public override bool ShouldOverrideUrlLoading(WebView view, string url)
{
view.LoadUrl(url);
return true;
}
}
保留现有的默认菜单,同时增加新的菜单:
public override void OnActionModeStarted(ActionMode mode)
{
IMenu menu = mode.Menu;
menu.Add("Add To Notes");
menu.GetItem(0).SetOnMenuItemClickListener(new MyMenuItemOnMenuItemClickListener(this));
base.OnActionModeStarted(mode);
}
在新 menu
上设置一个 ItemClickListerer
:
menu.GetItem(0).SetOnMenuItemClickListener(new MyMenuItemOnMenuItemClickListener(this));
public class MyMenuItemOnMenuItemClickListener : Java.Lang.Object, IMenuItemOnMenuItemClickListener
{
private MainActivity mContext;
public MyMenuItemOnMenuItemClickListener(MainActivity activity)
{
this.mContext = activity;
}
public bool OnMenuItemClick(IMenuItem item)
{
Toast.MakeText(mContext, "Hi", ToastLength.Short).Show();
return true;
}
}
效果类似this.
编辑 :
使用这个自定义 WebView
行为可能非常简单,您只需按照我上面指出的那样添加一个新菜单并初始化 Renderer
中的 WebView
,这是我的代码:
在Xamarin.Forms中:
public class WebPage : ContentPage
{
public WebPage()
{
var browser = new MyVebView();
browser.Source = "https://www.google.com.sg/?gfe_rd=cr&ei=gFDGWIjIH8LB9AXbwY3QDg";
Content = browser;
}
}
在你的 WebViewRenderer
中:
[assembly: ExportRenderer(typeof(MyVebView), typeof(MyVebViewRenderer))]
namespace FormsWebView.Droid
{
public class MyVebViewRenderer : WebViewRenderer
{
Android.Webkit.WebView webView;
protected override void OnElementChanged(ElementChangedEventArgs<WebView> e)
{
base.OnElementChanged(e);
if(Control == null)
{
webView = new Android.Webkit.WebView(Context);
webView.Settings.JavaScriptEnabled = true;
webView.SetWebViewClient(new MyWebViewClient());
webView.LoadUrl("https://www.google.com.sg/?gfe_rd=cr&ei=gFDGWIjIH8LB9AXbwY3QDg");
SetNativeControl(webView);
}
}
}
}
覆盖 onActionModeStarted
方法以添加新菜单,如我上面所说:
namespace FormsWebView.Droid
{
[Activity(Label = "FormsWebView", Icon = "@drawable/icon", Theme = "@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
protected override void OnCreate(Bundle bundle)
{
TabLayoutResource = Resource.Layout.Tabbar;
ToolbarResource = Resource.Layout.Toolbar;
base.OnCreate(bundle);
global::Xamarin.Forms.Forms.Init(this, bundle);
LoadApplication(new App());
}
public override void OnActionModeStarted(ActionMode mode)
{
//...
}
}
public class MyWebViewClient : WebViewClient
{
//...
}
public class MyMenuItemOnMenuItemClickListener : Java.Lang.Object, IMenuItemOnMenuItemClickListener
{
//...
}
}
Xamarin Android Webview 不允许 select 当 OnCreateContextMenu 被覆盖以将新菜单项放入上下文菜单时的文本。
此外,它不显示默认菜单。因此,我们希望在添加新菜单时保留现有的默认菜单,如复制、Select 全部等。
protected override void OnCreateContextMenu(Android.Views.IContextMenu menu)
{
base.OnCreateContextMenu(menu);
var item = menu.Add("Add To Notes");
item.SetOnMenuItemClickListener(this);
}
we want to retain the existing default menus like Copy, Select All, etc. as well when we are adding the new menu.
您可以覆盖 onActionModeStarted
方法以在默认 Menu
上添加新菜单。覆盖此方法,您可以通知 Activity
已启动操作模式。这是我的代码,它运行良好:
WebView view = FindViewById<WebView>(Resource.Id.web);
view.Settings.JavaScriptEnabled = true;
view.SetWebViewClient(new MyWebViewClient());
view.LoadUrl("https://www.google.com.sg/?gfe_rd=cr&ei=gFDGWIjIH8LB9AXbwY3QDg");
public class MyWebViewClient : WebViewClient
{
public override bool ShouldOverrideUrlLoading(WebView view, string url)
{
view.LoadUrl(url);
return true;
}
}
保留现有的默认菜单,同时增加新的菜单:
public override void OnActionModeStarted(ActionMode mode)
{
IMenu menu = mode.Menu;
menu.Add("Add To Notes");
menu.GetItem(0).SetOnMenuItemClickListener(new MyMenuItemOnMenuItemClickListener(this));
base.OnActionModeStarted(mode);
}
在新 menu
上设置一个 ItemClickListerer
:
menu.GetItem(0).SetOnMenuItemClickListener(new MyMenuItemOnMenuItemClickListener(this));
public class MyMenuItemOnMenuItemClickListener : Java.Lang.Object, IMenuItemOnMenuItemClickListener
{
private MainActivity mContext;
public MyMenuItemOnMenuItemClickListener(MainActivity activity)
{
this.mContext = activity;
}
public bool OnMenuItemClick(IMenuItem item)
{
Toast.MakeText(mContext, "Hi", ToastLength.Short).Show();
return true;
}
}
效果类似this.
编辑 :
使用这个自定义 WebView
行为可能非常简单,您只需按照我上面指出的那样添加一个新菜单并初始化 Renderer
中的 WebView
,这是我的代码:
在Xamarin.Forms中:
public class WebPage : ContentPage
{
public WebPage()
{
var browser = new MyVebView();
browser.Source = "https://www.google.com.sg/?gfe_rd=cr&ei=gFDGWIjIH8LB9AXbwY3QDg";
Content = browser;
}
}
在你的 WebViewRenderer
中:
[assembly: ExportRenderer(typeof(MyVebView), typeof(MyVebViewRenderer))]
namespace FormsWebView.Droid
{
public class MyVebViewRenderer : WebViewRenderer
{
Android.Webkit.WebView webView;
protected override void OnElementChanged(ElementChangedEventArgs<WebView> e)
{
base.OnElementChanged(e);
if(Control == null)
{
webView = new Android.Webkit.WebView(Context);
webView.Settings.JavaScriptEnabled = true;
webView.SetWebViewClient(new MyWebViewClient());
webView.LoadUrl("https://www.google.com.sg/?gfe_rd=cr&ei=gFDGWIjIH8LB9AXbwY3QDg");
SetNativeControl(webView);
}
}
}
}
覆盖 onActionModeStarted
方法以添加新菜单,如我上面所说:
namespace FormsWebView.Droid
{
[Activity(Label = "FormsWebView", Icon = "@drawable/icon", Theme = "@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
protected override void OnCreate(Bundle bundle)
{
TabLayoutResource = Resource.Layout.Tabbar;
ToolbarResource = Resource.Layout.Toolbar;
base.OnCreate(bundle);
global::Xamarin.Forms.Forms.Init(this, bundle);
LoadApplication(new App());
}
public override void OnActionModeStarted(ActionMode mode)
{
//...
}
}
public class MyWebViewClient : WebViewClient
{
//...
}
public class MyMenuItemOnMenuItemClickListener : Java.Lang.Object, IMenuItemOnMenuItemClickListener
{
//...
}
}