2017-07-18 66 views
0

Xamarin Andorid Webview不允许在OnCreateContextMenu被覆盖以在上下文菜单中添加新菜单项时选择文本。Xamarin Andorid Webview文本选择不适用于自定义上下文菜单

此外,它不显示默认菜单。所以,当我们添加新菜单时,我们想要保留现有的默认菜单,如复制,全选等。

protected override void OnCreateContextMenu(Android.Views.IContextMenu menu) 
{ 
    base.OnCreateContextMenu(menu); 
    var item = menu.Add("Add To Notes"); 
    item.SetOnMenuItemClickListener(this); 
} 
+0

你注册自定义上下文菜单你'WebView'?像这样的'RegisterForContextMenu(view)'方法。 –

+0

其实我使用Xamarin.Forms,但我写了自定义渲染器&试过RegisterForContextMenu(视图),但它给出了相同的结果。该选择仅在按下左移键时才起作用。 –

回答

0

我们希望保留现有的默认菜单像复制,全选等,以及当我们添加新的菜单。

您可以覆盖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); 
} 

坐落在新menuItemClickListerer

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行为可能是很简单,你只需要添加一个新的菜单,我想指出的上方和初始化RendererWebView,这里是我的代码:

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

感谢您的回应,我们尝试了这一点,它似乎在Xamarin.Android中运行良好,但是,OnActionModeStarted方法在Xamarin.Forms的WebView自定义呈现器中不可用。那么你能否让我们知道Xamarin.Forms中的OnActionModeStarted是否有解决方法? –

+0

@Shubham Bhosale,实际上'OnActionModeStarted'属于'Activity'类,你只需要在你的Xamarin.Android'Activity'中覆盖这个方法。 –

+0

谢谢。我们明白'OnActionModeStarted'属于'Activity'类,但我们不确定如何从Xamarin.Forms中的'WebViewRenderer'使用它。 –