Java 按钮onClick方法在单击“快速”时重新启动
我有一个可以算命的小应用程序(实际上只是随机的),有四个edittextfields可以输入,还有一个按钮可以选择其中一个edittextfields并将其删除。很简单。但我有一个问题,如果有人以过快的速度多次按下按钮,那么onClick()方法中的所有代码都不会执行(可能是因为它被再次调用)。是否有某种方法可以防止这种情况发生(我希望onClick()方法中的所有代码在再次调用之前执行) 代码如下:Java 按钮onClick方法在单击“快速”时重新启动,java,android,button,onclicklistener,Java,Android,Button,Onclicklistener,我有一个可以算命的小应用程序(实际上只是随机的),有四个edittextfields可以输入,还有一个按钮可以选择其中一个edittextfields并将其删除。很简单。但我有一个问题,如果有人以过快的速度多次按下按钮,那么onClick()方法中的所有代码都不会执行(可能是因为它被再次调用)。是否有某种方法可以防止这种情况发生(我希望onClick()方法中的所有代码在再次调用之前执行) 代码如下: package com.foretell.lukas.spamedprick;
package com.foretell.lukas.spamedprick;
import android.graphics.Bitmap;
import android.media.MediaPlayer;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RelativeLayout;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.Collections;
public class MainActivity extends AppCompatActivity {
ArrayList<EditText> tfa = new ArrayList<EditText>();
int x = 0;
boolean tf = true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// References to XML widgets
final RelativeLayout rl = (RelativeLayout) findViewById(R.id.background);
final Button daButton = (Button) findViewById(R.id.button);
Button restartButton = (Button) findViewById(R.id.restartButton);
final EditText ruta1 = (EditText) findViewById(R.id.editText);
final EditText ruta2 = (EditText) findViewById(R.id.editText2);
final EditText ruta3 = (EditText) findViewById(R.id.editText3);
final EditText ruta4 = (EditText) findViewById(R.id.editText4);
final TextView outputText = (TextView) findViewById(R.id.outputText);
tfa.add(ruta1);
tfa.add(ruta2);
tfa.add(ruta3);
tfa.add(ruta4);
final MediaPlayer mp = MediaPlayer.create(this, R.raw.spar);
final MediaPlayer mp2 = MediaPlayer.create(this, R.raw.hurra);
daButton.setOnClickListener(
new Button.OnClickListener() {
public void onClick(View v) {
if(tf) {
daButton.setEnabled(false);
mp.start();
try {
tf = false;
Thread.sleep(2000);
} catch (InterruptedException e) {
e.getStackTrace();
outputText.setText("Nått gick åt h***ete!");
}
Collections.shuffle(tfa);
x++;
if (x <= 2) {
outputText.setText("Det är inte " + tfa.get(0).getText() + "...");
tfa.get(0).setText("");
tfa.remove(0);
} else if (x == 3) {
outputText.setText("Det är...");
} else if (x == 4) {
tfa.get(1).setText("");
tfa.remove(1);
outputText.setText("Det är " + tfa.get(0).getText() + "!");
mp2.start();
}
tf = true;
daButton.setEnabled(true);
}else{
System.out.println("YO!");
}
}
}
);
restartButton.setOnClickListener(
new Button.OnClickListener() {
public void onClick(View v) {
tfa.add(ruta1);
tfa.add(ruta2);
tfa.add(ruta3);
tfa.add(ruta4);
ruta1.requestFocus();
outputText.setText("");
x = 0;
ruta1.setText("");
ruta2.setText("");
ruta3.setText("");
ruta4.setText("");
}
}
);
}
}
package com.foretel.lukas.spamedpick;
导入android.graphics.Bitmap;
导入android.media.MediaPlayer;
导入android.support.v7.app.AppActivity;
导入android.os.Bundle;
导入android.util.Log;
导入android.view.Menu;
导入android.view.MenuItem;
导入android.view.view;
导入android.widget.Button;
导入android.widget.EditText;
导入android.widget.RelativeLayout;
导入android.widget.TextView;
导入java.util.ArrayList;
导入java.util.Collections;
公共类MainActivity扩展了AppCompatActivity{
ArrayList tfa=新的ArrayList();
int x=0;
布尔tf=真;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//对XML小部件的引用
最终RelativeLayout rl=(RelativeLayout)findViewById(R.id.background);
最终按钮daButton=(按钮)findViewById(R.id.Button);
Button restartButton=(Button)findViewById(R.id.restartButton);
最终EditText ruta1=(EditText)findViewById(R.id.EditText);
最终EditText ruta2=(EditText)findViewById(R.id.editText2);
最终EditText ruta3=(EditText)findViewById(R.id.editText3);
最终EditText ruta4=(EditText)findViewById(R.id.editText4);
最终文本视图输出文本=(文本视图)findViewById(R.id.outputText);
tfa.add(ruta1);
tfa.add(ruta2);
tfa.add(ruta3);
tfa.add(ruta4);
final MediaPlayer mp=MediaPlayer.create(这个,R.raw.spar);
final MediaPlayer mp2=MediaPlayer.create(this,R.raw.hurra);
daButton.setOnClickListener(
新建按钮。OnClickListener(){
公共void onClick(视图v){
如果(tf){
daButton.setEnabled(false);
mp.start();
试一试{
tf=假;
《睡眠》(2000年);
}捕捉(中断异常e){
e、 getStackTrace();
setText(“Nått gickåt h***ete!”);
}
收藏。洗牌(tfa);
x++;
如果(x我不认为在最后一次“onClick”完成之前可以开始“onClick”
以下是android文档中的qoute:
系统不会为组件的每个实例创建单独的线程。在同一进程中运行的所有组件都会在UI线程中实例化,并且对每个组件的系统调用都会从该线程中调度。因此,响应系统回调的方法(如onKeyDown()要报告用户操作或生命周期回调方法,请始终在进程的UI线程中运行
也许您在onClick方法中做了一些事情,这会带来麻烦,但是如果没有代码,很难判断:)您必须这样做
Button button= (Button) findViewById(R.id.buttonId);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
button.setEnabled(false);
// do your work here
// make it true after your work is done
button.setEnabled(true);
}
});
您可以首先禁用按钮(button.setEnabled(false)),在onClickListener上执行操作,最后再次启用按钮(button.setEnabled(true))。希望这会对你有所帮助。我本来打算写同样的东西。只要禁用并启用按钮就行了。我本来打算写同样的东西。我也认为这可以做到,但由于某些原因,它不太管用。不要使用Thread.sleep,如果播放完成,mediaplayer会有一个回调。按照其他人所说的禁用按钮并启用但我想让它生效,这是一个用来告诉你命运的应用程序,睡眠的东西会让用户认为是向导或其他什么东西在想问题的关键是不要启用“onclick”结尾的按钮,但在算命结束时。当所有事情都设置好并完成时。回调可以是解决方案。但是所有“算命”代码都在onClick方法中,因此没有其他地方可以将setEnabled参数放入。mp.start()是异步的,您必须等待媒体播放结束并使用此回调:之后(以及代码的结尾)再次启用该按钮。