2014-10-22 18 views
5

Desidero disattivare il menu nativo contestuale che viene visualizzato quando si seleziona del testo, quello con la selezionare tutti, copia, parti e ricerca pulsanti . Tuttavia, non desidero disabilitare le selezioni. Idealmente vorrei ampliare il menu in realtà, ma onestamente, sono più che perfettamente corretto disabilitandolo. Con i campi di testo e simili tende ad essere relativamente semplice dalla documentazione che ho trovato, ma non riesco a capire un modo per farlo funzionare con XWalkView/CordovaWebView. Potrebbe essere che sto cercando solo nell'angolo completamente sbagliato però.Disabilita menu di selezione contestuale a strisce pedonali (Cordova)

+0

Quindi ... Chiunque cura di spiegare perché questo ha un downvote? –

+0

Sei mai riuscito a risolvere questo? –

+0

@Kufuma Sfortunatamente no, anche se abbiamo messo una taglia di 50, ma è stato ignorato :( –

risposta

-2

Questa CSS dovrebbe evitare che i menu contestuali, sia Android e IOS, come indicato nel modello 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

"Non voglio comunque disabilitare le selezioni da soli." –

1

ho una soluzione.

Per WebView c'è una soluzione, ma non funziona per XWalkView:

WebView selection menu workaround

mio Gradle include compile 'org.xwalk:xwalk_core_library:14.43.343.17'

La mia soluzione, l'idea principale nel metodo 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

Provo la soluzione di Warabei ma non funziona su 15.44.384.13. Miglioro trovare versioni trasversali 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); 
    } 
    ... 

Per disabilitare contestuale menu di selezione:

@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; 
     } 
    }; 
} 
Problemi correlati