RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1016700
Accepted
Infernal
Infernal
Asked:2020-08-23 22:54:38 +0000 UTC2020-08-23 22:54:38 +0000 UTC 2020-08-23 22:54:38 +0000 UTC

每次启用 SwitchCompat 按钮时如何运行操作?

  • 772

有一个开关按钮 SwitchCompat,当它被启用时,应该会来一个本地通知。问题是如果你设置了时间,然后打开拨动开关,那么通知就会来,但是如果你让拨动开关打开并设置一个新的通知时间,直到你关闭并打开它才会来再次在拨动开关上。如何解决?据我了解,该程序只检查一次拨动开关是否打开?

活动代码片段:

public class AlarmActivity extends AppCompatActivity implements TimePickerDialog.OnTimeSetListener {

    private EditText mondayText;
    private SwitchCompat mondaySwitch;
    SharedPreferences sPref;
    String timeText = "";
    final String SAVED_TEXT = "saved_text";
    boolean switch_On_Off;
    public static final String PREFS_NAME = "Switch_On_Off_check";
    final Calendar c = Calendar.getInstance();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_alarm);

        mondayText = findViewById(R.id.monday_time);
        mondaySwitch = findViewById(R.id.switch_monday);

        // load SharedPref save text in mondayText and save switch On else Off
        loadText();
        loadSwitchCheck();

        mondaySwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

                startAlarm(c);
                saveSwitchCheck();

            }
        });


        mondayText.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                DialogFragment timePicker = new TimePickerFragment();
                timePicker.show(getSupportFragmentManager(), "time picker");
            }
        });


    }

    @Override
    public void onTimeSet(TimePicker view, int hourOfDay, int minute) {

        c.set(Calendar.HOUR_OF_DAY, hourOfDay);
        c.set(Calendar.MINUTE, minute);
        c.set(Calendar.SECOND, 0);
        updateTimeText(c);
    }

    private void updateTimeText(Calendar c) {

        // clean EditText time
        timeText = "";
        timeText += DateFormat.getTimeInstance(DateFormat.SHORT).format(c.getTime());
        mondayText.setText(timeText);
        saveText();

    }

    public void startAlarm(Calendar c) {

        AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(this, AlertReceiver.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 1, intent, 0);

        if (c.before(Calendar.getInstance())) {
            c.add(Calendar.DATE, 1);
        }
        alarmManager.setExact(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), pendingIntent);

    }

所以,我做了一个检查来打开/关闭开关(或者我想我做了),但现在通知总是来,布尔 OnOff 变量被完全忽略

更正的代码:

public class AlarmActivity extends AppCompatActivity implements TimePickerDialog.OnTimeSetListener {

    private EditText mondayText;
    public SwitchCompat mondaySwitch;
    SharedPreferences sPref;
    String timeText = "";
    final String SAVED_TEXT = "saved_text";
    boolean switch_On_Off;
    boolean OnOff;
    public static final String PREFS_NAME = "Switch_On_Off_check";
    final Calendar c = Calendar.getInstance();


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_alarm);

        mondayText = findViewById(R.id.monday_time);
        mondaySwitch = findViewById(R.id.switch_monday);

        // load SharedPref save text in mondayText and save switch On else Off
        loadText();
        loadSwitchCheck();

        mondaySwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

                if (mondaySwitch.isChecked()) {

                    OnOff = true;
                    Toast.makeText(getApplicationContext(), "Включено", Toast.LENGTH_SHORT).show();

                } else {
                    OnOff = false;
                    Toast.makeText(getApplicationContext(), "Выключено", Toast.LENGTH_SHORT).show();
                }

                saveSwitchCheck();

            }
        });

        mondayText.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                DialogFragment timePicker = new TimePickerFragment();
                timePicker.show(getSupportFragmentManager(), "time picker");
            }
        });

    }

    @Override
    public void onTimeSet(TimePicker view, int hourOfDay, int minute) {

        c.set(Calendar.HOUR_OF_DAY, hourOfDay);
        c.set(Calendar.MINUTE, minute);
        c.set(Calendar.SECOND, 0);
        updateTimeText(c);

        if (OnOff = true) {
            startAlarm(c);
        } else {
            Toast.makeText(getApplicationContext(), "Включите", Toast.LENGTH_SHORT).show();
        }
    }

    private void updateTimeText(Calendar c) {

        timeText = "";
        timeText += DateFormat.getTimeInstance(DateFormat.SHORT).format(c.getTime());
        mondayText.setText(timeText);
        saveText();

    }

    public void startAlarm(Calendar c) {


        AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(this, AlertReceiver.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 1, intent, 0);

        if (c.before(Calendar.getInstance())) {
            c.add(Calendar.DATE, 1);
        }
        alarmManager.setExact(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), pendingIntent);

    }
java
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Infernal
    2020-08-26T22:22:28Z2020-08-26T22:22:28Z

    目前我只找到了一种解决方案,每次用户设置新时间时通过开关码关闭开关,由于这个提醒会在每周的指定时间工作一次,用户不会经常更改通知时间,如有必要,您可以随时写入线路,以便在设置新时间时,开关先关闭然后再打开。如果有人需要,我附上代码:

    public class AlarmActivity extends AppCompatActivity implements TimePickerDialog.OnTimeSetListener {
    
    
        private EditText mondayText;
        public SwitchCompat mondaySwitch;
        SharedPreferences sPref;
        String timeText = "";
        final String SAVED_TEXT = "saved_text";
        boolean switch_On_Off;
        public static final String PREFS_NAME = "Switch_On_Off_check";
        final Calendar c = Calendar.getInstance();
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_alarm);
            mondayText = findViewById(R.id.monday_time);
            mondaySwitch = findViewById(R.id.switch_monday);
            // load SharedPref save text in mondayText and save switch On else Off
            loadText();
            loadSwitchCheck();
    
            mondaySwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    if (mondaySwitch.isChecked()) {
                        // запуск уведомления если активирован переключатель
                        startAlarm(c);
    
                    }
                    saveSwitchCheck();
                }
            });
    
            mondayText.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    DialogFragment timePicker = new TimePickerFragment();
                    timePicker.show(getSupportFragmentManager(), "time picker");
                }
            });
        }
    
        @Override
        public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
             // деактивируем переключатель
             mondaySwitch.setChecked(false);
            c.set(Calendar.HOUR_OF_DAY, hourOfDay);
            c.set(Calendar.MINUTE, minute);
            c.set(Calendar.SECOND, 0);
           // после установки времени активируем переключатель без участия пользователя (при желании) 
             mondaySwitch.setChecked(true);
            updateTimeText(c);
    
    
            saveText();
        }
    
        private void updateTimeText(Calendar c) {
            // clear old time text
            timeText = "";
            timeText += DateFormat.getTimeInstance(DateFormat.SHORT).format(c.getTime());
            mondayText.setText(timeText);
        }
    
        public void startAlarm(Calendar c) {
    
            AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
            Intent intent = new Intent(this, AlertReceiver.class);
            PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 1, intent, 0);
            if (c.before(Calendar.getInstance())) {
                c.add(Calendar.DATE, 1);
            }
            alarmManager.setExact(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), pendingIntent);
        }
    
    • 0

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    根据浏览器窗口的大小调整背景图案的大小

    • 2 个回答
  • Marko Smith

    理解for循环的执行逻辑

    • 1 个回答
  • Marko Smith

    复制动态数组时出错(C++)

    • 1 个回答
  • Marko Smith

    Or and If,elif,else 构造[重复]

    • 1 个回答
  • Marko Smith

    如何构建支持 x64 的 APK

    • 1 个回答
  • Marko Smith

    如何使按钮的输入宽度?

    • 2 个回答
  • Marko Smith

    如何显示对象变量的名称?

    • 3 个回答
  • Marko Smith

    如何循环一个函数?

    • 1 个回答
  • Marko Smith

    LOWORD 宏有什么作用?

    • 2 个回答
  • Marko Smith

    从字符串的开头删除直到并包括一个字符

    • 2 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5