2015-01-28 2 views
-3

Привет, ребята, я пытаюсь изучить Android самостоятельно, но застрял в проблеме. На странице есть четыре кнопки, и если я нажму одну кнопку, другие кнопки не будут работать. Это код для фонарика, Я пытаюсь заставить его мигать в течение требуемого времени. Он мигает должным образом, но если я нажму кнопку, другая кнопка не будет работать. Если кто-нибудь предложит мне предложение по этой проблеме. Вот код:Button не работает

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; 
    } 
} 

activity_main.xml:

<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="On" 
    android:id="@+id/buttonOn" 
    android:layout_marginLeft="62dp" 
    android:layout_marginStart="62dp" 
    android:layout_marginTop="100dp" 
    android:layout_alignParentTop="true" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentStart="true" /> 

<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Off" 
    android:id="@+id/buttonOff" 
    android:layout_marginLeft="30dp" 
    android:layout_marginStart="30dp" 
    android:layout_alignTop="@+id/buttonOn" 
    android:layout_toRightOf="@+id/buttonOn" 
    android:layout_toEndOf="@+id/buttonOn" /> 

<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="2 Seconds" 
    android:id="@+id/button1" 
    android:layout_marginTop="164dp" 
    android:layout_below="@+id/buttonOn" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentStart="true" /> 

<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="4 seconds" 
    android:id="@+id/button2" 
    android:layout_alignTop="@+id/button1" 
    android:layout_alignParentRight="true" 
    android:layout_alignParentEnd="true" /> 

<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="8 seconds" 
    android:id="@+id/button3" 
    android:layout_alignParentBottom="true" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentStart="true" 
    android:layout_marginBottom="60dp" /> 

<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="16 Seconds" 
    android:id="@+id/button4" 
    android:layout_alignBottom="@+id/button3" 
    android:layout_alignLeft="@+id/buttonOff" 
    android:layout_alignStart="@+id/buttonOff" 
    android:layout_alignRight="@+id/button2" 
    android:layout_alignEnd="@+id/button2" /> 

+0

Сделать отдельный метод, который содержит щелчок слушатель всех ваших кнопок. Не добавляйте код инициализации для просмотра слушателя. – GrIsHu

+0

Вы нажимаете кнопки один за другим, не выключая вспышку? Тогда это не сработает, потому что ваша функция 'turnOnFlash' работает только тогда, когда вспышка выключена. –

+0

@Alexander_Winter: Если я нажму кнопку ON, он включится, если я нажму «OFF», он выключится, но если я нажму другую кнопку, скажу 2 секунды, он будет нормально мигать, но остальные кнопки не будут работать. –

ответ

4

Вместо добавления new OnClickListener() отдельно для каждой кнопки, добавьте implements OnClickListener к вашему Activity класса и добавить соответствующие пустоты:

@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); 
+0

@Oluwantumbi: Я сделал модификацию, как вы сказали, но по-прежнему такая же ошибка. –

+0

какую кнопку вы нажали, а другие перестали работать? – Oluwatumbi

+0

@Oluwantumbi: есть 6 кнопок: ON, OFF, 2 секунды, 4 секунды, 8 секунд и 16 секунд. Если я нажму «ON» и «OFF», свет включится и выключится соответственно. Если я нажму 2 секунды, фонарик начнет мигать требования, но когда работает 2-секундная кнопка, я не могу щелкнуть ни одной из других кнопок. Фонарик будет постоянно мигать, я даже не могу выключить фонарик. Можете ли вы сказать мне решение для этого? –

0

Ваш метод blink указывает do - while цикл, в котором говорится должен продолжать мигать, пока время меньше или равно 10. Но я считаю, что это не то, чего вы хотите достичь. Я считаю, что вы хотите, чтобы вспышка продолжала мигать, пока вы не нажмете кнопку «StopFlash».

Для этого вам нужно создать логическое значение в своей деятельности, которое позволит вам знать, возможно, вам стоит остановить флеш-память и использовать ее в цикле while.

Шаг 1 создать глобальную булево в вашем Activity:

protected boolean should_continue_flash; 

Шаг 2 Используйте его в делать - пока петля

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 Добавьте код, чтобы сделать ваш булево возвращать ложь, так что вы может прекратить мигать

Под вашим методом onClick(View v)

case R.id.stop_blink_button: 
     should_continue_flash = false; 

Шаг-Добавьте это к кнопке, которая инициирует мигание:

should_continue_flash = true; 
    blink(your_time_here); 

Надеется, что это помогает

+0

, и он не работает. –

+0

Пожалуйста, ищите другой способ имитации мигания, кроме сна. сна будет спать в системе и, возможно, не сможет прослушать ваше событие onClick при спящем режиме. использование таймера – Oluwatumbi

+0

Как это? Я не знаю, пожалуйста, пришлите мне код. –

0

теперь мой код выглядит следующим образом. пожалуйста, проверьте это[email protected]

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; 

    } 
} 
} 
0

В вашей деятельности создать Timer объект, так что вы можете использовать и повторно использовать

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

И stop blink:

timer.cancel(); 
    timer.purge(); 

Это должно работать для вас

Документации здесь:

Открытой декларации аннулированию java.util.Timer.schedule (TimerTask задача, долго задержки, длительный период)

общественной пустоты расписание (задача TimerTask, длительная задержка, длительный период) Добавлен в уровне API 1 Запланируйте задачу для повторного выполнения с фиксированной задержкой после определенной задержки.

Параметры задачи задача планирования.
Задержка Время в миллисекундах перед первым исполнением.
период время в миллисекундах между последующими казнями.

Броски IllegalArgumentException если задержка < 0 или период < = 0. IllegalStateException если таймер был отменен, или если задача была запланирована или отменена.

Надеется, что это помогает

+0

, он почти работает, но не соответствует требованиям ... что это ваш_time_interval_here? –

+0

теперь его не выйдет .. Если кнопка OFF нажата, мигает проблесковый свет. –

+0

добавить timer.cancel(); и timer.purge(); к вашей кнопке вы можете использовать оператор if, если вы не инициализировали свой таймер :: if (timer! = null) {timer.cancel(); timer.purge();} – Oluwatumbi