我有一个每日警报和一个设置页面,允许用户更改每日警报的触发时间。我的SettingsFragment中有一个OnSharedPreferenceChangeListener,它扩展了PreferenceFragmentCompat,并且在这里工作。但是,当我在MainActivity中执行相同的操作时,它似乎无法正常工作。
这是我在主要活动中的代码: '''
public class MainActivity extends AppCompatActivity {
//some other variables
private SharedPreferences.OnSharedPreferenceChangeListener preferenceChangeListener;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//some other code
preferenceChangeListener = new SharedPreferences.OnSharedPreferenceChangeListener() {
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if (key.equals("daily alarm time")){
int alarmTime = sharedPreferences.getInt("daily alarm time", 36000000);
setdailyalarm(alarmTime, true, false);
System.out.println("onsharedpreferencechange activited");
}
if (key.equals("daily alarm toggle")){
Boolean dailyAlarmToggle = sharedPreferences.getBoolean(key, true);
System.out.println("111111111111111111111111");
if (dailyAlarmToggle){
int alarmTime = sharedPreferences.getInt(key, 36000000);
setdailyalarm(alarmTime, true, false);
}
else{
int alarmTime = sharedPreferences.getInt(key, 36000000);
setdailyalarm(alarmTime, true, true);
}
}
}
};
}
'''
这是我的暂停和继续: '''
@Override
protected void onPause() {
super.onPause();
PreferenceManager.getDefaultSharedPreferences(this).unregisterOnSharedPreferenceChangeListener(preferenceChangeListener);
}
@Override
protected void onResume() {
super.onResume();
PreferenceManager.getDefaultSharedPreferences(this).registerOnSharedPreferenceChangeListener(preferenceChangeListener);
}
'''
当我启动我的应用程序并检查我的System.out时,“''System.out.println(“ onsharedpreferencechange activited”);'''似乎没有触发,这意味着我的OnSharedPreferenceChangeListener无法正常工作。我似乎还有其他讨论SharedPreferences.onSharedPreferenceChangeListener not being called consistently,但这似乎不是解决我问题的方法。
答案 0 :(得分:0)
当我启动我的应用程序并检查我的System.out时,'''System.out.println(“ onsharedpreferencechange activited”);'''似乎没有触发,这意味着我的OnSharedPreferenceChangeListener无法正常工作。
这是因为您总是在onPause()
中注销监听器。因此,无论何时离开活动,监听器都会被删除,您将无法监听SharedPreferences
的更改。
您可以在onCreate()
方法中注册侦听器。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// setup the listener
preferenceChangeListener = new SharedPreferences.OnSharedPreferenceChangeListener() {
...
// then register it
PreferenceManager.getDefaultSharedPreferences(this).registerOnSharedPreferenceChangeListener(preferenceChangeListener);
}
然后,当您通过覆盖onDestroy()
方法来关闭活动时,取消注册侦听器:
@Override
public void onDestroy() {
PreferenceManager.getDefaultSharedPreferences(this).unregisterOnSharedPreferenceChangeListener(preferenceChangeListener);
super.onDestroy();
}
或者在您每次调用finish()
方法时注销侦听器。在finish()
之前调用注销部分,或重写finish()
方法。