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
{
     //...
}
}