0

У меня есть переключатель, который запускает TimePickerDialog для установки тревоги. Я хочу, чтобы будильник погас, когда он выключен. Также я хочу снова установить будильник, когда я включу его.Как отключить будильник с помощью переключателя

public class MainAddMedActivity extends AppCompatActivity { 

    private TextView txtAlarmPrompt; 
    private TimePickerDialog timePickerDialog; 
    private Switch switchReminder; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main_add_med); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

     this.txtAlarmPrompt = (TextView) findViewById(R.id.txtAlarmPrompt); 
     this.switchReminder = (Switch) findViewById(R.id.switchReminder); 

     switchReminder.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
      @Override 
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
       if (isChecked) { 
        openTimerPickerDialog(true); 
        timePickerDialog.setOnCancelListener(new DialogInterface.OnCancelListener() { 
         @Override 
         public void onCancel(DialogInterface dialog) { 
          switchReminder.setChecked(false); 
         } 
        }); 
       } 
      } 
     }); 
    } 

    private void openTimerPickerDialog(boolean is24HourView) { 
     Calendar cal = Calendar.getInstance(); 

     timePickerDialog = new TimePickerDialog(
       MainAddMedActivity.this, 
       onTimeSetListener, 
       cal.get(Calendar.HOUR_OF_DAY), 
       cal.get(Calendar.MINUTE), 
       is24HourView); 
     timePickerDialog.show(); 
    } 

    TimePickerDialog.OnTimeSetListener onTimeSetListener = new TimePickerDialog.OnTimeSetListener() { 
     @Override 
     public void onTimeSet(TimePicker view, int hourOfDay, int minute) { 
      Calendar calNow = Calendar.getInstance(); 
      Calendar calSet = (Calendar) calNow.clone(); 

      calSet.set(Calendar.HOUR_OF_DAY, hourOfDay); 
      calSet.set(Calendar.MINUTE, minute); 
      calSet.set(Calendar.SECOND, 0); 
      calSet.set(Calendar.MILLISECOND, 0); 

      if (calSet.compareTo(calNow) <= 0) { 
       calSet.add(Calendar.DATE, 1); 
      } 
      setAlarm(calSet); 
     } 
    }; 

    private void setAlarm(Calendar targetCal) { 
     txtAlarmPrompt.setText(getString(R.string.txtPromptAlarm) + " " + targetCal.getTime()); 
     Intent intent = new Intent(getApplicationContext(), AlarmNotificationReceiver.class); 
     final PendingIntent pendingIntent = PendingIntent.getBroadcast(this, AlarmNotificationReceiver.REQUEST_CODE, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
     final AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
     alarmManager.set(AlarmManager.RTC_WAKEUP, targetCal.getTimeInMillis(), pendingIntent); 

     ***switchReminder.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
      @Override 
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
       if (isChecked = false) { 
        alarmManager.cancel(pendingIntent); 
       } 
      } 
     });*** //This Part is wrong does not work 
    } 

ответ

0

Ваш OnCheckedChangeListener не работает, из-за вашего if-statement.

if (isChecked = false) присвоит false переменной isChecked перед if -statement бежится и поэтому тело вашей if -statement никогда не будет выполняться, поскольку isChecked никогда не будет правдой.

Использование = будет присвоить правую сторону как новое значение левой стороны, а == будет оценивать 2 значения друг против друга.

Изменить if -statement на:

if (!isChecked) { 
    alarmManager.cancel(pendingIntent); 
} 

Вы также могли бы сделать:

if (isChecked == false) { 
    alarmManager.cancel(pendingIntent); 
} 

, но это считается плохой практикой, чтобы проверить, если boolean либо true или false с помощью if (myBoolean == true) или if (myBoolean == false) as if: booleans.

Для установки будильника снова, вам нужен else на вашем if -statement, где вы можете позвонить alarmManager.set(AlarmManager.RTC_WAKEUP, targetCal.getTimeInMillis(), pendingIntent);

Так if-else будет что-то вроде этого:

if (!isChecked) { 
    alarmManager.cancel(pendingIntent); 
} else { 
    alarmManager.set(AlarmManager.RTC_WAKEUP, targetCal.getTimeInMillis(), pendingIntent); // Remember to change the time to a new time in millis. 
} 
+0

Хехе, простые ошибки, подобные этим, обычно худшие - их действительно трудно увидеть и найти. Я не видел этого до того, как я начал писать комментарий к вашему вопросу, а затем я действительно понял, что происходит :-) – Darwind