【问题标题】:Disable contextual selection menu in crosswalk (cordova)禁用人行横道中的上下文选择菜单(cordova)
【发布时间】:2014-10-22 17:46:12
【问题描述】:

我希望禁用在您选择某些文本时显示的本机上下文菜单,即带有 select allcopyshare的菜单> 和 搜索 按钮。但是,我不想自己禁用选择。理想情况下,我实际上希望扩展菜单,但老实说,我完全可以禁用它。使用文本字段等,从我找到的文档来看,它往往相对简单,但我只是想不出一种方法来使用XWalkView/CordovaWebView。可能是我只是在完全错误的角落搜索。

【问题讨论】:

  • 所以...有人愿意解释为什么这会被否决吗?
  • 你能解决这个问题吗?
  • @Kufuma 可悲的是,没有,甚至悬赏 50,但它被忽略了:(
  • 那太糟糕了。我现在正在努力寻找解决方案。如果我找到解决方法,是否有兴趣发布 50 分赏金?
  • @Kufuma 一直期待答案! (虽然现在几乎不可能发布 50 个代表的赏金:P)

标签: java android cordova crosswalk-runtime


【解决方案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);
  }

}

【讨论】:

    【解决方案2】:

    我尝试了 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;
            }
        };
     }
    

    【讨论】:

      【解决方案3】:

      这是一个旧帖子,但我无法找到其他解决方案。

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

      1. 将您的人行横道项目转到 res/menu/select_action_menu.xml
      2. 删除或评论您不想显示的项目
      3. 保存、构建并运行

      【讨论】:

        【解决方案4】:

        这个 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' */
        }
        

        【讨论】:

        • “我不想自己禁用选择。”
        猜你喜欢
        • 1970-01-01
        • 2020-10-18
        • 1970-01-01
        • 2013-06-13
        • 1970-01-01
        • 2012-01-23
        • 1970-01-01
        • 2015-01-31
        • 1970-01-01
        相关资源
        最近更新 更多