2011-11-07 85 views
2

我目前正在爲Android手機制作的應用程序出現問題。我有一個有兩個按鈕的活動。關鍵是如果我按兩個按鈕足夠快(這不是一個好的用戶行爲),那兩個按鈕會觸發,而我只想發射(最多)只有其中一個按鈕。這是一個代碼片段比如我的意思:Android:將setOnClickListener設置爲按鈕。當按下太快時觸發兩次

public class ActivityLevels extends Activity { 

private boolean launched; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    //Set the content view of the screen 
    setContentView(R.layout.levels); 

    //Set lauched flag to false 
    launched = false; 

    //Initialize buttons 
    Button loadLevel01 = (Button) findViewById(R.id.ButtonLoadLevel01); 
    Button loadLevel02 = (Button) findViewById(R.id.ButtonLoadLevel02); 

    //Set Button Listeners 
    loadLevel01.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View view) { 
      launchGame(0); 
     } 
    }); 

    loadLevel02.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View view) { 
      launchGame(1); 
     } 

    }); 
} 

private void launchGame(int level) { 

    //Just launch the activity if !lanched 
    if(!launched) { 
     launched = true; 
     //Start Activity 
    } 
} 
} 

我一直在檢查一個星期左右的互聯網,並沒有發現任何的方法來防止這種情況。據我發現,看起來像有人已經發布了類似的問題在這裏:Issue 20073: Button onClick listener can be fired twice even if button is disabled immediately in listener

順便說一句,我也試過在「launchGame(int)」調用之前立即禁用按鈕,但沒有取得了一切。 此代碼只是整個活動的改編片段。我認爲可以理解我的意思,但如果您需要其他描述,請告訴我。

在此先感謝,並對任何拼寫錯誤感到抱歉,我的英文不是很好。

回答

6

我真的解決了我的問題。重點是讓我的方法launchGame(int level)同步,所以它不能被訪問多次,才能完成。這樣,假設我們有兩個來自點擊監聽器的線程,因爲我按下了按鈕1和按鈕2非常快:使用同步方法,它將被稱爲lauchGame(1),完成操作,然後launchGame(2)boolean launched標誌設置爲true

這是我做了什麼:

private void synchronized launchGame(int level) { 

    //Just launch the activity if !lanched 
    if(!launched) { 
     launched = true; 
     //Start Activity 
    } 
} 

不管怎麼說,非常感謝您的所有答案!

+0

確保您將答案標記爲「已接受」,以便其他人可以瞭解您的解決方案。乾杯〜 –

0

您可以將「其他」按鈕的OnClickListener設置爲null,其中一個點擊按鈕。

+0

我也試過,但也不工作。監聽器觸發後,「其他」按鈕將設置爲空。感謝您的回答! –

0

如上所述,清除onclicklistener上任何你不想調用的東西。我會爲此投票。但是,您也可以在按鈕點擊處理程序中嘗試在此活動中調用「完成」。我不確定這會是你想要的流量,但我認爲它會阻止其他呼叫(儘管沒有嘗試過)。

+0

我認爲你所說的並不適合我的場景。恢復的事實是,我在屏幕A,有15個按鈕(每個級別一個)。當用戶按下一個按鈕時,我開始遊戲活動(B),當它完成時,活動A讀取結果並顯示分數。所以我有:活動A(15個按鈕) - 選擇其中一個 - >去活動B並配置它 - 完成遊戲 - >返回到活動A並閱讀結果。感謝您的回答! –

+0

是的,如果你回到活動,這將無法正常工作。 –

0

嘗試用你的啓動狀態

loadLevel01.setOnClickListener(new View.OnClickListener() { 
    public void onClick(View view) { 
     if (launched) return;    
     launchGame(0); 
    } 
}); 
+0

這應該是最簡單的方法。 – josephus

+0

我試過這個,但不起作用。如果我按兩個按鈕足夠快,他們似乎都通過了if(lauched)return;我在該語句和launchGame(0)之間放了一個Log.d,它出現兩次,所以這個解決方案是不正確的。感謝您回答! –

1

阻止按鈕你可以使用一個onclicklistener爲他們兩個和保護所有與互斥的內容。

+0

這應該有效。另外,你甚至不需要使用同一個監聽器,只需要在同一個對象上進行同步。 – kabuko

+0

你好,謝謝你的回答。你能解釋一下你的建議的更多細節嗎?提前謝謝了! –

相關問題