Java 按钮';它不工作了

Java 按钮';它不工作了,java,android,button,Java,Android,Button,嗨,伙计们,我正在尝试自己研究Android,但遇到了问题。一个页面中有四个按钮,如果我单击一个按钮,其他按钮将无法工作。这是一个手电筒代码,我正在尝试使其在所需时间内闪烁。它正确闪烁,但如果我单击某个按钮,其他按钮将不起作用。有人可以给我有关此问题的建议。以下是代码: MainActivity.java Camera camera; boolean isFlashOn; boolean hasFlash; Parameters params; Button flashOn, flashOff

嗨,伙计们,我正在尝试自己研究Android,但遇到了问题。一个页面中有四个按钮,如果我单击一个按钮,其他按钮将无法工作。这是一个手电筒代码,我正在尝试使其在所需时间内闪烁。它正确闪烁,但如果我单击某个按钮,其他按钮将不起作用。有人可以给我有关此问题的建议。以下是代码:

MainActivity.java

 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();