我的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)”调用之前立即禁用该按钮,但没有实现任何目标。 这段代码只是整个活动的一个改编片段。我认为可以理解我的意思,但如果您需要任何其他描述,请告诉我。
提前致谢,对于任何拼写错误感到抱歉,我的英语不是很好。
答案 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);
}
});