【问题标题】:How to avoid unintended touch-inputs in an android app?如何避免 Android 应用程序中的意外触摸输入?
【发布时间】:2020-06-29 13:17:44
【问题描述】:

出于研究目的,我正在开发一个原生 Android 应用程序(使用 Java),它允许走动康复后的老年患者记录营养日记。

由于目标群体的年龄较大,必须考虑到用户的手在颤抖。

我避免“意外”输入的方法: 是否存在某种全局设置来定义两个触摸输入之间的“最短时间”?如果此时间不足,则应用仅执行第一个输入并忽略此时间范围内的其他输入。

当然,我对其他方法和想法持开放态度。也许Android本身为震颤的人提供输入帮助?到目前为止,我找不到任何可以帮助我解决这个话题的东西。

为了让您了解情况: 用户点击一个按钮。这会导致 UI 发生变化,并且新按钮会出现在用户单击的完全相同的位置。此按钮不应直接“可点击”。但当然,其他位置的按钮也不应该直接做出反应。

【问题讨论】:

  • 你将如何确定这是一次无意的接触?
  • 我的观点是你有两个按钮,它们彼此靠近。如果用户尝试单击第一个按钮但单击了第二个按钮。您要处理这种情况?
  • 当一个按钮被点击时,记住它被点击的时间(System.currentTimeMillis()),设置一个最终的“noClickWithinThisAmountOfMS”并在按钮的onClickListeners中执行一个简单的检查:if((newTime - oldTime) > noClickWithinThisAmountOfMS),然后不要忽略点击。
  • @HappySingh 你是对的。我不能肯定,这些输入是无意的,但这是我的第一种方法。场景与您描述的有点不同。用户单击一个按钮,UI 刷新,并且在用户单击的完全相同的位置将是一个新按钮,不应意外按下该按钮。

标签: android touch


【解决方案1】:

记住最后一次点击Button的时间,然后将该时间与下一次点击Button的时间进行比较:

final long noClickWithinThisAmountOfMS = 2000; //2000ms = 2 seconds
long oldTime = 0;
long newTime = 0;
Button buttonOne = (Button) view.findViewById(R.id.button_one);
Button buttonTwo = (Button) view.findViewById(R.id.button_two);

buttonOne.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        newTime = System.currentTimeMillis();

        if((newTime - oldTime) > noClickWithinThisAmountOfMS) {
            //Don't ignore the click
            oldTime = newTime;

            //TODO: Add actual "onClick" code here

        } //else: Ignore the click
    }
});

buttonTwo.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        newTime = System.currentTimeMillis();
        if((newTime - oldTime) > noClickWithinThisAmountOfMS) {
            oldTime = newTime;
            //TODO: Add actual "onClick" code here
        }
    }
});

对每个必须受到影响的Button 执行此操作。

您甚至可以通过使用多个 oldTimenewTime 以这种方式创建按钮“集群”,例如ButtonOne 和 ButtonTwo 彼此相邻,但应独立于 ButtonThree 和 ButtonFour。

【讨论】:

  • 我还会建议更改按钮的状态(当用户可以/不能按下时)
  • 你会如何在不同的活动之间分享oldTime?只是正常的意图?
  • @DemoDemo 如果禁用按钮,它也将不再可点击,这意味着 OP 必须在后台运行一个线程,在 x 秒后再次启用按钮。另外,我不确定禁用按钮是否也会改变它的外观,因为如果这样做,我不会这样做,因为它会使用户感到困惑。
  • @danielk 你可以,是的。您还可以将它作为静态长存储在一个额外的类中,以便从多个活动/片段中访问它。您写道,您将按钮替换为同一位置的新按钮。这个开关需要多长时间?如果您将noClickWithinThisAmountOfMS 设置为例如2s 和 switch 需要 2s,那么这显然是没有必要的。或许可以考虑将开关“延长”一点,所以它不是即时的,这也可以让老用户有时间移动手指并“调整”。
  • @Neph UI 在用户按下按钮后立即刷新。所以没有明显的“延迟”。我想我会更喜欢在一段时间内忽略输入的方法,否则用户可能会认为,如果他们单击 UI 保持不变,应用程序就会崩溃。
【解决方案2】:

为什么不把所有的按钮都放在一个数组里,给它们都一样的onClickListener接口 当 onClick 一个 for 循环遍历这个数组并禁用每个 else 按钮​​时,就像这样

ArrayList<Button> buttons = new ArrayList<>;
buttons.add(button1);
buttons.add(button2);
buttons.add(button3);
for(Button button : buttons){

button.addOnClickListener(new View.onClickListener(){
    for(Button button1 : buttons){
       button1.setEnabled(false);
    }
});

【讨论】:

  • 如果您单击一个按钮,这将禁用每个按钮,但您如何再次重新启用它们?按钮在被禁用时不会对onClickListener 事件做出反应,因此您需要某种类型的计时器来重新启用它们。我可以想象像这样改变按钮的状态是一种“昂贵”的方式。
猜你喜欢
  • 2016-01-08
  • 1970-01-01
  • 1970-01-01
  • 2012-03-06
  • 2014-10-19
  • 1970-01-01
  • 2019-11-07
  • 2018-10-23
  • 1970-01-01
相关资源
最近更新 更多