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

时间:2011-11-07 20:09:06

标签: 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
    }
}
}

我已经在网上查了一个星期左右,并没有找到任何方法来阻止这种情况。据我所知,看起来某人已在此处发布了类似的问题:Issue 20073: Button onClick listener can be fired twice even if button is disabled immediately in listener

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

提前致谢,对于任何拼写错误感到抱歉,我的英语不是很好。

5 个答案:

答案 0 :(得分:6)

我实际上解决了我的问题。关键是要使我的方法launchGame(int level)同步,因此在完成之前不能多次访问它。这样,假设我们有两个来自点击侦听器的线程,因为我按下按钮一个,按钮两个非常快:使用synchronized方法,它将被称为lauchGame(1),完成动作,然后{{1将launchGame(2)标记设置为boolean launched

这就是我所做的:

true

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

答案 1 :(得分:1)

您可以为它们使用一个onclicklistener并使用互斥锁保护所有内容。

答案 2 :(得分:0)

您可以将“其他”按钮的OnClickListener设置为单击按钮中的null

答案 3 :(得分:0)

如上所述,清除onclicklistener上你不想要的任何东西。我会为此投票。但是,您也可以尝试在按钮单击处理程序中对此活动调用“完成”。我不确定这会是你想要的流量,但我认为它会阻止其他电话(尽管没有试过)。

答案 4 :(得分:0)

尝试使用启动状态阻止按钮

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