如何使用开关关闭闹钟

How can I turn off my alarm with a switch

我有一个开关可以触发 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
    }

你的 OnCheckedChangeListener 不工作,因为你的 if-statement.

if (isChecked = false) 将在 if 语句被 运行 之前将 false 分配给变量 isChecked,因此 [=18 的正文=]-语句永远不会是 运行,因为 isChecked 永远不会为真。

使用 = 会将 right-hand-side 分配为 left-hand-side 的新值,而 == 将相互评估 2 个值。

将您的 if-语句更改为:

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

你也可以这样做:

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

但是通过使用 if (myBoolean == true)if (myBoolean == false) 作为 [=18 来检查 booleantrue 还是 false 被认为是不好的做法=] 直接计算 booleans

要再次设置闹钟,您需要在 if 语句中添加 else,您可以在其中调用 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.
}