Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 试图从PreferenceFragment设置重复警报,但未工作。我怎样才能解决这个问题?_Android_Kotlin_Alarmmanager_Android Alarms_Preferencefragment - Fatal编程技术网

Android 试图从PreferenceFragment设置重复警报,但未工作。我怎样才能解决这个问题?

Android 试图从PreferenceFragment设置重复警报,但未工作。我怎样才能解决这个问题?,android,kotlin,alarmmanager,android-alarms,preferencefragment,Android,Kotlin,Alarmmanager,Android Alarms,Preferencefragment,因此,在我的android应用程序的主要活动中,我有一个扩展到PreferenceFragmentCompat的设置片段,可以设置一个打开报警的开关。然而,重复警报不起作用,我不太清楚原因 以下是我调用的片段中一些相关方法的代码: override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) { if (key == USERNAME){ val user

因此,在我的android应用程序的主要活动中,我有一个扩展到
PreferenceFragmentCompat
的设置片段,可以设置一个打开报警的开关。然而,重复警报不起作用,我不太清楚原因

以下是我调用的片段中一些相关方法的代码:

override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) {
    if (key == USERNAME){
        val username = sharedPreferences.getString(USERNAME, DEFAULT_VALUE)
        usernamePreference.summary = username
    }
    if (reminderPreference.isChecked){
        saveReminder(true,sharedPreferences)
        alarmReceiver.setRepeatingAlarm(fragmentContext,"RepeatingAlarm","01:20","Github reminder")
    } else {
        saveReminder(false,sharedPreferences)
        alarmReceiver.cancelAlarm(fragmentContext)
    }
}

private fun saveReminder(state: Boolean,sharedPreferences: SharedPreferences) {
    val settingsPreference = SettingsPreference(fragmentContext)
    settings = SettingsModel()
    settings.reminder = state
    settings.username = sharedPreferences.getString(USERNAME,DEFAULT_VALUE)
    settingsPreference.setSettings(settings)
}
以下是
设置参考
类中的一些代码:

internal class SettingsPreference(context: Context){
companion object{
    private const val PREFS_NAME = "settings_pref"
    private const val USERNAME_KEY = "username"
    private const val REMINDER_KEY = "switch_preference"
}

private val preferences = context.getSharedPreferences(PREFS_NAME,Context.MODE_PRIVATE)

fun setSettings(value: SettingsModel){
    val editor = preferences.edit()
    editor.putString(USERNAME_KEY,value.username)
    editor.putBoolean(REMINDER_KEY,value.reminder)
    editor.apply()
}

fun getSettings(): SettingsModel{
    val model = SettingsModel()
    model.username = preferences.getString(USERNAME_KEY,"username")
    model.reminder = preferences.getBoolean(REMINDER_KEY,false)
    return model
}
}

完整的代码可以在我的github存储库中看到:

更新: 可能是因为我的片段上下文导致了这个问题

override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
    addPreferencesFromResource(R.xml.preferences)
    init()
    setSummaries()
}

private fun init(){
    USERNAME = resources.getString(R.string.key_username)
    usernamePreference = findPreference<EditTextPreference>(USERNAME) as EditTextPreference

    LANGUAGE = resources.getString(R.string.language)
    languageSettings = findPreference<Preference>(LANGUAGE) as Preference

    REMINDER = resources.getString(R.string.switch_preference)
    reminderPreference = findPreference<SwitchPreference>(REMINDER) as SwitchPreference

    alarmReceiver = AlarmReceiver()

    fragmentContext = activity?.applicationContext!!
    fragmentContext.registerReceiver(alarmReceiver, IntentFilter())
    val settingsPreference = SettingsPreference(fragmentContext)
    if (settingsPreference.getSettings().reminder){
        reminderPreference.isChecked = true
    } else {
        reminderPreference.isChecked = false
    }
}
override fun onCreatePreferences(savedInstanceState:Bundle?,rootKey:String?){
addPreferencesFromResource(R.xml.preferences)
init()
集合摘要()
}
私人娱乐中心(){
USERNAME=resources.getString(R.string.key\u用户名)
usernamePreference=FindReference(用户名)作为EditTextPreference
LANGUAGE=resources.getString(R.string.LANGUAGE)
languageSettings=FindReference(语言)作为首选项
提醒=resources.getString(R.string.switch\u首选项)
reminderPreference=findPreference(提醒)作为开关首选项
alarmReceiver=alarmReceiver()
fragmentContext=activity?.applicationContext!!
fragmentContext.registerReceiver(alarmReceiver,IntentFilter())
val settingsPreference=settingsPreference(fragmentContext)
if(设置引用.getSettings().reminder){
reminderPreference.isChecked=true
}否则{
reminderPreference.isChecked=false
}
}

您在什么地方注册了
AlarmReceiver
了吗?它不在您的清单中,因此您需要在代码中的某个地方调用
Context.registerReceiver()
:@cactustictac我刚刚在我的清单中注册了它。您可以查看我的上一次提交,但它仍然不起作用。
onReceive
是否在
AlarmReceiver
类中触发?您可以使用一些日志语句来说明特定方法何时触发,这样您就可以知道发生了什么和没有发生什么(或者设置一些断点并运行调试器)。你需要找到它没有做它应该做的事情的确切位置。。。此外,您正在使用
setInexact
调用来设置警报-这允许系统在不同的时间发出警报,如果更方便的话,可能会在几分钟内出错!在开发和测试应用程序时,您可能应该使用一个
setExact
调用