Java 按钮';它不工作了
嗨,伙计们,我正在尝试自己研究Android,但遇到了问题。一个页面中有四个按钮,如果我单击一个按钮,其他按钮将无法工作。这是一个手电筒代码,我正在尝试使其在所需时间内闪烁。它正确闪烁,但如果我单击某个按钮,其他按钮将不起作用。有人可以给我有关此问题的建议。以下是代码: MainActivity.javaJava 按钮';它不工作了,java,android,button,Java,Android,Button,嗨,伙计们,我正在尝试自己研究Android,但遇到了问题。一个页面中有四个按钮,如果我单击一个按钮,其他按钮将无法工作。这是一个手电筒代码,我正在尝试使其在所需时间内闪烁。它正确闪烁,但如果我单击某个按钮,其他按钮将不起作用。有人可以给我有关此问题的建议。以下是代码: MainActivity.java Camera camera; boolean isFlashOn; boolean hasFlash; Parameters params; Button flashOn, flashOff
Camera camera;
boolean isFlashOn;
boolean hasFlash;
Parameters params;
Button flashOn, flashOff, button1, button2, button3, button4;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
checkFlashlight();
getCamera();
initFlashlightButton();
}
void checkFlashlight() {
hasFlash = getApplicationContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);
if (!hasFlash) {
AlertDialog alert = new AlertDialog.Builder(
MainActivity.this).create();
alert.setTitle("Error");
alert.setMessage("Sorry, your device doesn't support flash light!");
alert.setButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
finish();
}
});
alert.show();
return;
}
}
private void blink(int time) {
do {
turnOnFlash();
try {
sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
turnOffFlash();
try {
sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
blink(time);
} while (time <= 10);
}
private void initFlashlightButton() {
flashOn = (Button) findViewById(R.id.buttonOn);
flashOff = (Button) findViewById(R.id.buttonOff);
button1 = (Button) findViewById(R.id.button1);
button2 = (Button) findViewById(R.id.button2);
button3 = (Button) findViewById(R.id.button3);
button4 = (Button) findViewById(R.id.button4);
flashOn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
turnOnFlash();
}
});
flashOff.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
turnOffFlash();
}
});
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
turnOnFlash();
blink(1000);
}
});
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
turnOnFlash();
blink(500);
}
});
button3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
turnOnFlash();
blink(300);
}
});
button4.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (isFlashOn) {
turnOffFlash();
} else {
turnOnFlash();
}
blink(100);
}
});
}
private void getCamera() {
if (camera == null) {
try {
camera = Camera.open();
params = camera.getParameters();
} catch (RuntimeException e) {
Log.e("Camera Error. Failed to Open. Error: ", e.getMessage());
}
}
}
private void turnOnFlash() {
if (!isFlashOn) {
if (camera == null || params == null) return;
params = camera.getParameters();
params.setFlashMode(Parameters.FLASH_MODE_TORCH);
camera.setParameters(params);
camera.startPreview();
isFlashOn = true;
return;
}
}
// flash OFF
private void turnOffFlash() {
if (isFlashOn) {
if (camera == null || params == null) return;
params = camera.getParameters();
params.setFlashMode(Parameters.FLASH_MODE_OFF);
camera.setParameters(params);
camera.stopPreview();
isFlashOn = false;
return;
}
}
@Override
protected void onDestroy() {
super.onDestroy();
}
@Override
protected void onPause() {
super.onPause();
turnOffFlash();
}
@Override
protected void onRestart() {
super.onRestart();
}
@Override
protected void onResume() {
super.onResume();
if (hasFlash)
turnOnFlash();
}
@Override
protected void onStart() {
super.onStart();
getCamera();
}
@Override
protected void onStop() {
super.onStop();
if (camera != null) {
camera.release();
camera = null;
}
}
摄像机;
布尔闪蒸;
布尔hasblash;
参数参数;
按钮闪动,闪动,按钮1,按钮2,按钮3,按钮4;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
检查手电筒();
getCamera();
initFlashlightButton();
}
无效检查手电筒(){
hasFlash=getApplicationContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE\u CAMERA\u FLASH);
如果(!hasFlash){
AlertDialog alert=新建AlertDialog.Builder(
MainActivity.this.create();
警报。设置标题(“错误”);
setMessage(“对不起,您的设备不支持闪光灯!”);
alert.setButton(“确定”,新建DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog,int which){
完成();
}
});
alert.show();
返回;
}
}
私有无效闪烁(整数时间){
做{
闪光灯();
试一试{
睡眠(时间);
}捕捉(中断异常e){
e、 printStackTrace();
}
关闭闪光灯();
试一试{
睡眠(时间);
}捕捉(中断异常e){
e、 printStackTrace();
}
眨眼(时间);
}(time而不是将new OnClickListener()
分别添加到每个按钮,而是将实现OnClickListener
添加到活动
类,并添加相应的void:
@Override
Public void onClick(View v){
int id = v.getId();
switch(id){
case R.id.yourbutton1:
//do your job here
break;
case R.id.yourbutton2:
//do your second job here
break;
}
}
因此,与其添加新的OnClickListeners,不如对每个按钮执行以下操作:
button.setOnClickListener(this);
您的闪烁方法指定do
-while
循环,该循环表示当时间小于或等于10时应继续闪烁。但我相信这不是您想要实现的。我相信您希望闪光灯一直闪烁,直到您按下“stopFlash”按钮
为此,你必须在你的活动中创建一个布尔值,让你知道也许你应该停止flash并在你的while循环中使用它
步骤1在活动中创建全局布尔值:
protected boolean should_continue_flash;
第2步在do-while循环中使用它
private void blink(int time) {
do {
turnOnFlash();
try {
sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
turnOffFlash();
try {
sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
blink(time);
} while (should_continue_flash);
}
步骤3添加代码,使布尔返回为false,以便停止闪烁
在onClick(视图v)
方法下
case R.id.stop_blink_button:
should_continue_flash = false;
步骤4:将此添加到启动闪烁的按钮:
should_continue_flash = true;
blink(your_time_here);
希望这有帮助现在我的代码看起来像这样。请检查一下。@Oluwatumbi
Camera camera;
boolean isFlashOn;
boolean hasFlash;
Parameters params;
Button flashOn, flashOff, button1, button2, button3, button4;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
flashOn = (Button) findViewById(R.id.buttonOn);
flashOff = (Button) findViewById(R.id.buttonOff);
button1 = (Button) findViewById(R.id.button1);
button2 = (Button) findViewById(R.id.button2);
button3 = (Button) findViewById(R.id.button3);
button4 = (Button) findViewById(R.id.button4);
checkFlashlight();
getCamera();
initFlashlightButton();
}
void checkFlashlight() {
hasFlash = getApplicationContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);
if (!hasFlash) {
AlertDialog alert = new AlertDialog.Builder(
MainActivity.this).create();
alert.setTitle("Error");
alert.setMessage("Sorry, your device doesn't support flash light!");
alert.setButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
finish();
}
});
alert.show();
return;
}
}
private void blink(int time) {
do {
turnOnFlash();
try {
sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
turnOffFlash();
try {
sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
blink(time);
} while (isFlashOn);
}
private void initFlashlightButton() {
flashOn.setOnClickListener(this);
flashOff.setOnClickListener(this);
button1.setOnClickListener(this);
button2.setOnClickListener(this);
button3.setOnClickListener(this);
button4.setOnClickListener(this);
}
private void getCamera() {
if (camera == null) {
try {
camera = Camera.open();
params = camera.getParameters();
} catch (RuntimeException e) {
Log.e("Camera Error. Failed to Open. Error: ", e.getMessage());
}
}
}
private void turnOnFlash() {
if (!isFlashOn) {
if (camera == null || params == null) return;
params = camera.getParameters();
params.setFlashMode(Parameters.FLASH_MODE_TORCH);
camera.setParameters(params);
camera.startPreview();
isFlashOn = true;
return;
}
}
// flash OFF
private void turnOffFlash() {
if (isFlashOn) {
if (camera == null || params == null) return;
params = camera.getParameters();
params.setFlashMode(Parameters.FLASH_MODE_OFF);
camera.setParameters(params);
camera.stopPreview();
isFlashOn = false;
return;
}
}
@Override
protected void onDestroy() {
super.onDestroy();
}
@Override
protected void onPause() {
super.onPause();
turnOffFlash();
}
@Override
protected void onRestart() {
super.onRestart();
}
@Override
protected void onResume() {
super.onResume();
if (hasFlash)
turnOnFlash();
}
@Override
protected void onStart() {
super.onStart();
getCamera();
}
@Override
protected void onStop() {
super.onStop();
if (camera != null) {
camera.release();
camera = null;
}
}
@Override
public void onClick(View v) {
int id=v.getId();
switch (id){
case R.id.buttonOn:
turnOnFlash();
break;
case R.id.buttonOff:
isFlashOn=false;
turnOffFlash();
break;
case R.id.button1:
isFlashOn=true;
blink(1000);
break;
case R.id.button2:
isFlashOn=true;
blink(500);
break;
case R.id.button3:
isFlashOn=true;
blink(300);
break;
case R.id.button4:
isFlashOn=true;
blink(100);
break;
}
}
}
在活动中创建一个计时器
对象,以便可以使用和重用
Timer timer;
在blink()
方法中,初始化计时器并如下模拟闪烁:
timer = new Timer();
timer.schedule(new TimerTask(){
@Override
public void run() {
// TODO Auto-generated method stub
YourActivity.this.runOnUiThread(new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
//Do the blinking job here
}
});
}
}, 0, your_time_interval_here);
要停止闪烁:
timer.cancel();
timer.purge();
这应该对你有用
此处的文档:
打开声明void java.util.Timer.schedule(TimerTask任务,长
延迟(长周期)
添加了公共无效计划(TimerTask任务、长延迟、长周期)
在API级别1中,为重复的固定延迟执行安排任务
在特定的延迟之后
参数
任务要安排的任务。
延迟第一次执行前的时间量(毫秒)。
期间后续执行之间的时间量(毫秒)
如果delay<0或period Make separate方法包含您的all按钮的click listener,则抛出IllegalArgumentException。不要添加带有视图初始化代码的listener。您是否在不关闭flash的情况下一个接一个地按下按钮?那么它将不起作用,因为您的功能仅是打开flash
闪光关闭时工作。@Alexander_Winter:如果我单击按钮,它将打开;如果我单击其他按钮,它将关闭;但是如果我单击其他按钮,说2秒钟,它将正确闪烁,但其余的按钮将不工作。为什么?如果(!isFlashOn),请删除行
从您的打开Flash
功能,然后再次测试。@Alexander_Winter:是的,我删除了,但仍然出现了相同的错误。@Oluwantumbi:我已经按照您所说的做了修改,但仍然出现了相同的错误。@Oluwantumbi:有6个按钮打开、关闭、2秒、4秒、8秒和16秒。如果我点击打开和关闭,灯就会亮起来如果我点击2秒,手电筒将根据要求闪烁,但当2秒按钮工作时,我无法点击任何其他按钮。手电筒将持续闪烁,我甚至无法关闭手电筒。你能告诉我解决方法吗?@Oluwantumbi:你能给我解决方法吗?@Oluwantumbi:请检查我代码中的blink();方法。它正确吗?我发布了另一个回答,解决了你的blink()
method请寻找另一种模拟眨眼的方法,而不是睡眠。睡眠会使系统处于睡眠状态,并且在睡眠时可能听不到您的onClick事件。使用timer这是什么?我不知道。请将代码发送给我。我已经发布了一个新的答案,解决了计时器的使用问题。它几乎可以工作,但不符合要求s、 …这是你的时间间隔吗?现在它没有关闭。如果按下关闭按钮,手电筒将闪烁。将timer.cancel()和timer.purge()添加到你的按钮,如果你没有初始化计时器,你可以使用if语句::if(timer!=null){timer.cancel();timer.purge();}
timer.cancel();
timer.purge();