Android 试图从PreferenceFragment设置重复警报,但未工作。我怎样才能解决这个问题?
因此,在我的android应用程序的主要活动中,我有一个扩展到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
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
调用