【问题标题】:How to disable long-click which opens the Android top menu bar with copy/paste/etc. buttons in Cordova Crosswalk apps?如何禁用通过复制/粘贴/等打开 Android 顶部菜单栏的长按。 Cordova Crosswalk 应用程序中的按钮?
【发布时间】:2015-08-11 18:31:39
【问题描述】:

正如标题所说,我有一个 Cordova 应用程序,它安装了 Cordova Crosswalk 插件并在 Android 和 iOS 上运行。

特别是在 Android 上,至少在 Android 5.1.1 和 4.4.4 版本上(由于 Crosswalk 可能在所有版本上),每当我长按输入字段时,我的 WebView 会缩小高度并显示带有剪切/复制/粘贴/剪贴板按钮的奇怪风格的顶部栏,以及关闭顶部栏的“后退”按钮:

如何防止这种长按?我尝试在我的应用的 MainActivity.java 中的 WebView 上添加一个 onLongClickListener 并调用 setLongClickable(false),如下所示:

public class MainActivity extends CordovaActivity {
    private static final String TAG = MainActivity.class.getSimpleName();

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Set by <content src="index.html" /> in config.xml
        loadUrl(launchUrl);

        // disable the context menu and all long clicks
        super.getView().setOnLongClickListener(new View.OnLongClickListener() {
            public boolean onLongClick(View v) {
            return true;
            }
        });
        super.appView.getView().setLongClickable(false);
        Log.i(TAG, "setLongClickable false");
    }
}

好像没什么效果。我还添加了以下 CSS 规则:

* {
    -webkit-text-size-adjust: none !important;
    -webkit-touch-callout: none !important;
    -webkit-user-select: none !important;
    user-select: none !important;
  }

这也没有效果。

我还尝试了以下 Javascript,它在渲染任何视图之前运行(使用 Backbone/Marionette/Handlebars)(#viewport 是正文中的第一个 div 元素):

  function stopEvent(e) {
    e.preventDefault();
    e.stopPropagation();
    return false;
  }

  window.oncontextmenu = function (e) {
    return stopEvent(e);
  };

  window.onselectstart = function(e) {
    return stopEvent(e);
  };
  window.ondragstart = function(e) {
    return stopEvent(e);
  };

  $('#viewport').on('taphold', function(e) {
    console.log("taphold");
    e.preventDefault();
    e.stopPropagation();

    return false;
  });

再一次,没有效果。

我几乎可以肯定这是由于 Cordova Crosswalk WebView,因为在删除插件后,行为消失了:长按没有任何反应。 Crosswalk WebView 是否可能忽略了 setLongClickable / setOnLongClickListener 方法调用?也许还有另一个“隐藏的”WebView 我需要调用这些方法?

如何禁用顶部栏?我不介意编辑 Cordova 或 Crosswalk Java 源代码。谢谢。

编辑:也许这是相关的? https://crosswalk-project.org/jira/browse/XWALK-4786

【问题讨论】:

    标签: javascript android cordova crosswalk-runtime


    【解决方案1】:

    在大多数情况下要停止文本复制栏,您必须设置视图的属性:

    focusable = false
    clickable = false
    

    除非您需要单击视图来执行某些操作。

    【讨论】:

    • 您能详细说明一下吗? “视图的属性”是什么意思?这些属性究竟是什么?而且我确实需要正常的触摸输入(但不是“鼠标点击”输入),因为它是一个移动应用程序。
    • 在 XML 中,您可以为包括 webview 在内的任何视图设置这些属性。
    • 我认为我没有任何 XML 文件可以设置它;我认为实际的 WebView 是以编程方式实例化的。我认为代码等价物是setFocusablesetClickable,但是如果我这样做,大概用户将无法聚焦或触摸我视图的任何部分。此外,无论如何我认为它不会生效,因为我已经在做setLongClickable(false) 并添加了我的 OnLongClickListener 并且这似乎没有生效。问题很可能是 XWalkWebView 实际上并没有对这些方法调用做任何事情,或者可能还有另一个“隐藏的”WebView。谢谢。
    【解决方案2】:

    看起来这是 Crosswalk 中的一个错误,并且已提交修复它的 PR:

    https://github.com/crosswalk-project/crosswalk/pull/3193

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-16
      • 1970-01-01
      • 1970-01-01
      • 2013-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多