Android Studio OnSharedPreferenceChangedListener 在 MainActivity 中不工作

Android Studio OnSharedPreferenceChangedListener not working in MainActivity

我有一个每日闹钟和一个允许用户更改每日闹钟触发时间的设置页面。我的 SettingsFragment 中有一个 OnSharedPreferenceChangeListener,它扩展了 PreferenceFragmentCompat,它在这里工作。然而,当我在我的 MainActivity 中做同样的事情时,它似乎没有工作。

这是我在 Main Activity 中的代码: '''

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);
                    }
                }
            }
        };

}

'''

这是我的 onpause 和 onresume: '''

@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 但它似乎并不能解决我的问题。

When I start my app and check my System.out, '''System.out.println("onsharedpreferencechange activited");''' does not seem to be firing which means my OnSharedPreferenceChangeListener is not working.

这是因为您总是在 onPause() 中注销监听器。因此,无论何时您离开 activity,监听器都会被移除,您无法监听 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);

}

然后在关闭 activity 时通过覆盖 onDestroy() 方法注销侦听器:

@Override
public void onDestroy() {
  PreferenceManager.getDefaultSharedPreferences(this).unregisterOnSharedPreferenceChangeListener(preferenceChangeListener);

  super.onDestroy();
}

或者在调用 finish() 方法时注销监听器。在 finish() 之前调用取消注册部分或覆盖 finish() 方法。