Android:setOnClickListener为Buttons.按下太快时射击两次

San*_*lez 2 android button listener

我有一个我正在为Android手机制作的应用程序的问题.我有一个有两个按钮的Activity.关键是如果我足够快地按下两个按钮(这不是一个好的用户行为),那两个按钮会触发,而我只想触发(最多)只有其中一个按钮.这是一个代码片段来举例说明我的意思:

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
    }
}
}
Run Code Online (Sandbox Code Playgroud)

我已经在网上查了一个星期左右,并没有找到任何方法来阻止这种情况.据我所知,看起来有人已经在这里发布了类似的问题:问题20073:即使在监听器中立即禁用按钮,按钮onClick监听器也可以被触发两次

顺便说一句,我也尝试在"launchGame(int)"调用之前立即禁用该按钮,但没有实现任何目标.这段代码只是整个活动的一个改编片段.我认为可以理解我的意思,但如果您需要任何其他描述,请告诉我.

在此先感谢,并对任何拼写错误感到抱歉,我的英语不是很好.

San*_*lez 6

我实际上解决了我的问题.关键是要使我的方法launchGame(int level)同步,因此在完成之前不能多次访问它.通过这种方式,让我们说我们有从点击听众两个线程,因为我按下按钮一个按钮和两个非常非常快:与一个synchronized方法,它会被称为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
    }
}
Run Code Online (Sandbox Code Playgroud)

无论如何,非常感谢您的所有答案!