2017-04-07 117 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); 
     } 
    } 
}) 

...