android - 在 Android 上,有什么方法可以禁用 Spinner 的长按行为吗?

标签 android spinner long-press

默认的微调器行为是当它“关闭”时,长按它会“打开”它并显示下拉 View 。我发现这种行为对用户来说可能是非常有问题的。例如,如果他们试图在屏幕上滚动某些东西,并且碰巧“捕获”了一个有微调器的地方,那么它不会滚动,而是会在一秒钟左右后打开下拉 View ,并且用户是基本上他们的手指停留在其中一个下拉选项上(他们现在可能会不小心按下)。

因此,我想禁用长按行为,并在仅单击而不是长按时让微调器“打开”。这可能吗?

最佳答案

如果您只需要恢复标准的点击行为,这是一个更简单、更紧凑的 Jordi's answer 版本:

spinner.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_UP) {
                v.performClick();
            }
            return true;
        }
    });

进一步思考

这种行为也让我很恼火。经过调查,它似乎有一个名字:拖动打开。您可以在 AppCompatSpinner#onTouchEvent() 的源代码中查看它是如何定义的方法。

我看到这种强制行为的一些问题(以及一些人想要禁用它的原因):

  1. 它允许用户在微调器中选择禁用的值。通过长按、拖动和释放,您可以选择甚至无法通过正常交互(点击打开 + 点击选择)选择的值
  2. 作为 #1 的结果,它还可以很容易地使 Espresso 测试失败。事实上,在 Espresso 中,点击的持续时间相当不稳定,一次点击可以很快变成长按和选择交互。
  3. 最后,这里最大的问题是没有方法/XML 属性来禁用“拖动打开”行为...

让我们修复它!

我已经在 AOSP 问题跟踪器上打开了与此相关的票证:#228953 .请随时关注它,或者如果我遗漏了什么,请发表评论。

关于android - 在 Android 上,有什么方法可以禁用 Spinner 的长按行为吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27923266/

相关文章:

android - 微调器 - 弹出/ ListView 中的不同项目文本

android - 列表项长按转场

javascript - 使用 React Native 在 Android/iOS 上使用不同的 lineHeight

android - 如何以编程方式在 Android 中翻转 ImageButton

android - 微调器显示错误的值

android - 关于菜单和微调器的位置!

ios - 当有长按手势识别器时,UIButton 不会改变文本颜色

android - 如何在 ListView onItemLongClick 上显示/启用按钮

android - 资源中图像的缩略图

android - 如何从 Linux 连接到 Android 蓝牙 socket