禁用人行横道(cordova)中的上下文选择菜单

时间:2014-10-22 17:46:12

标签: java android cordova crosswalk-runtime

我希望禁用选择某些文本时显示的本机上下文菜单, select all copy share 搜索按钮。但是,我不想自己禁用选择。理想情况下,我希望实际扩展菜单,但说实话,我只是禁用它完全没问题。对于文本字段等,我发现的文档往往相对简单,但我无法找到一种方法来使用XWalkView / CordovaWebView。可能我只是在完全错误的角落里寻找。

4 个答案:

答案 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);
  }

}

答案 1 :(得分: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;
        }
    };
 }

答案 2 :(得分:0)

这是一篇旧文章,但是我找不到其他解决方案。

在人行横道视图中禁用上下文选项的简单解决方法。

  1. 转到人行横道项目,进入res / menu / select_action_menu.xml
  2. 删除或删除您不想显示的项目
  3. 保存,构建和运行

答案 3 :(得分:-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' */
}