2017-04-07 85 views
2

我有一个简单的AlertDialog响应同时按下的多个按钮。例如,有一个“是”和“否”按钮,如果用户使用两个手指同时按下两个手指,则会触发yes和no的OnClickListeners并运行代码。我已经提到了android:splitMotionEvents =“false”,但是我仅仅使用默认的AlertBuilder而没有添加任何视图,并且似乎没有设置它的方法。我可以尝试像创建时间戳这样的东西,但这看起来像是一个黑客攻击,我希望Android代码中会有一些东西可以处理。防止在AlertDialog上按多个按钮

这里是我的代码:

AlertDialog.Builder builder = new AlertDialog.Builder(TestActivity.this); 
builder.setTitle(R.string.title) 

    .setMessage(getString(R.string.message)) 
    .setCancelable(false) 
    .setPositiveButton(R.string.yes, new android.content.DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      runTest(false); 
     } 
    }) 
    .setNeutralButton(R.string.no, new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      runTest(true); 
     } 
    }) 
    .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      // do nothing 
     } 
    }); 

AlertDialog dialog = builder.create(); 

回答

3

我有一种感觉,你对这个对话框

一个样式资源只需添加

<item name="android:splitMotionEvents">false</item> 

到您的对话框的风格。它将防止使用它的所有对话的多点触摸。

+0

这是我希望存在的解决方案类型。谢谢。 –

+0

android:splitMotionEvents =“false”这只会用于引导布局的子节点。 – Remario

1

它必须运行一个又一个被点击的按钮顺序排列。如果您已经完成了警报对话框的任务,那么您必须在按钮单击时关闭它,并且如果您正在执行点击任务并且不想关闭它,则使用进度条无法点击其他按钮直到先前的方法已完成。

+0

是的,它调用一个,完成然后启动下一个。你的意思是用dialog.dismiss()调用吗?这样做似乎并没有影响它从处理两个按钮按下。 –

+0

然后在全局声明一个布尔值,并为其赋值为false,然后在按钮单击时将其变为true,并且您可以检查它是否为false,然后仅执行点击内的操作。 – Anmol

2

最简单的方法是声明一个静态变量,使用这个变量来跟踪你想要解析的按钮的按下,然后检查当前按钮是否等于存储的状态。

+0

这仍然看起来像是一个黑客,但如果Android不支持自己处理这个,我想它将不得不这样做。谢谢。 –

+0

好,如果你有兴趣我可以告诉你更复杂的方式,使用反应式编程,你知道RXJava? – Remario

+0

对不起,你的回答很好。我的意思是,这个功能并没有内置到AlertDialog本身,这似乎很奇怪。我必须相信,大多数开发人员对AlertDialog的预期行为是它只接受来自一个按钮的输入并放弃其他任何按钮。 –

2

使用像一个字段变量:

boolean isWorking = false;

然后将它集成到像所有的onClickListeners,以确保他们不执行,如果另一个正在执行

...

.setPositiveButton(R.string.yes, new android.content.DialogInterface.OnClickListener() { 
    @Override 
    public void onClick(DialogInterface dialog, int which) { 
     if (!isWorking) { 
      isWorking = true; 
      runTest(false); 
     } 
    } 
}) 

...