2017-07-18 50 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'使用它。 –