2014-10-22 3 views
5

Я хочу, чтобы отключить встроенное контекстное меню, которое отображается при выборе какого-либо текст, то один с выбрать все, копирования, доли кнопок и поиск , Однако я не хочу самостоятельно отключать выбор. В идеале я хотел бы расширить меню на самом деле, но, честно говоря, я более чем прекрасно понимаю, просто отключив его. С текстовыми полями и т. П. Он имеет тенденцию быть относительно простым из документации, которую я нашел, но я просто не могу понять, как сделать эту работу с XWalkView/CordovaWebView. Возможно, я просто искал совершенно неправильный угол.Отключить контекстное меню выбора в пешеходном (Cordova)

+0

Итак ... Кто-нибудь заботиться, чтобы объяснить, почему это получило downvote? –

+0

Вы когда-нибудь могли это решить? –

+0

@ Kufuma К сожалению нет, даже наложил на него щедрость 50, но он проигнорировался :( –

ответ

-2

Этот CSS должен предотвратить контекстное меню как в Android и IOS, как указано в шаблоне Cordova

* { 
-webkit-tap-highlight-color: rgba(0,0,0,0); /* make transparent link selection, adjust last value opacity 0 to 1.0 */ 
} 

body { 
-webkit-touch-callout: none; /* prevent callout to copy image, etc when tap to hold */ 
-webkit-text-size-adjust: none; /* prevent webkit from resizing text to fit */ 
-webkit-user-select: none;  /* prevent copy paste, to allow, change 'none' to 'text' */ 
} 
+0

«Я, однако, не хочу отключать выбор самостоятельно». –

1

У меня есть обходной путь.

Для WebView есть решение, но оно не работает для XWalkView:

WebView selection menu workaround

Мой Gradle включает compile 'org.xwalk:xwalk_core_library:14.43.343.17'

Мое решение, основная идея в методе onAttachedToWindow:

public class XWalkWebView extends XWalkView { 

    public XWalkWebView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    } 

    private ActionMode.Callback mOriginalCallback; 

    @Override 
    protected void onAttachedToWindow() { 
    super.onAttachedToWindow(); 
    try { 
     View innerChild = ((ViewGroup) getChildAt(0)).getChildAt(0); 
     Field contentViewField = innerChild.getClass().getDeclaredField("mContentView"); 
     contentViewField.setAccessible(true); 
     XWalkContentView xWalkContentView = (XWalkContentView) contentViewField.get(innerChild); 
     Field contentViewCoreField = xWalkContentView.getClass().getSuperclass().getDeclaredField("mContentViewCore"); 
     contentViewCoreField.setAccessible(true); 
     ContentViewCore viewCore = (ContentViewCore) contentViewCoreField.get(xWalkContentView); 
     viewCore.setContainerView(this); 
    } catch (NoSuchFieldException | IllegalAccessException e) { 
     e.printStackTrace(); 
    } 
    } 

    @Override 
    public ActionMode startActionMode(ActionMode.Callback callback) { 
    mOriginalCallback = callback; 
    ActionMode.Callback c = new // your callback... 
    return super.startActionMode(c); 
    } 

} 
0

Я пробую решение Warabei, но оно не работает по 15.44.384.13. Улучшаю найти кросс версию ContentViewCore:

public class XWalkWebView extends XWalkView { 
    ... 
    private Field getFields(Class clazz){ 
     for(Field field:clazz.getDeclaredFields()){ 
      if(ContentViewCore.class == field.getType()){ 
       return field; 
      } 
     } 
     clazz = clazz.getSuperclass(); 
     if(clazz!=null && clazz!=Object.class){ 
      Field field = getFields(clazz); 
      if(field!=null)return field; 
     } 
     return null; 
    } 
    private void inject(View view){ 
     Field field = getFields(view.getClass()); 
     if(field!=null){ 
      field.setAccessible(true); 
      try { 
       ContentViewCore viewCore = (ContentViewCore) field.get(view); 
       viewCore.setContainerView(this); 
       return; 
      }catch(Exception e){ 

      } 
     } 
     if(view instanceof ViewGroup){ 
      ViewGroup viewGroup = (ViewGroup)view; 
      int count = viewGroup.getChildCount(); 
      for(int i = 0;i<count;i++){ 
       inject(viewGroup.getChildAt(i)); 
      } 
     } 
    } 
    @Override 
    protected void onAttachedToWindow() { 
     super.onAttachedToWindow(); 
     inject(this); 
    } 
    ... 

Чтобы отключить контекстное меню выбора:

@Override 
public ActionMode startActionMode(ActionMode.Callback callback) { 
    return new ActionMode() { 
     @Override 
     public void setTitle(CharSequence charSequence) { 

     } 

     @Override 
     public void setTitle(int i) { 

     } 

     @Override 
     public void setSubtitle(CharSequence charSequence) { 

     } 

     @Override 
     public void setSubtitle(int i) { 

     } 

     @Override 
     public void setCustomView(View view) { 

     } 

     @Override 
     public void invalidate() { 

     } 

     @Override 
     public void finish() { 

     } 

     @Override 
     public Menu getMenu() { 
      return null; 
     } 

     @Override 
     public CharSequence getTitle() { 
      return null; 
     } 

     @Override 
     public CharSequence getSubtitle() { 
      return null; 
     } 

     @Override 
     public View getCustomView() { 
      return null; 
     } 

     @Override 
     public MenuInflater getMenuInflater() { 
      return null; 
     } 
    }; 
} 
Смежные вопросы