Android Studio OnSharedPreferenceChangedListener在MainActivity中不起作用

时间:2019-07-12 09:12:02

标签: android-studio listener

我有一个每日警报和一个设置页面,允许用户更改每日警报的触发时间。我的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,但这似乎不是解决我问题的方法。

1 个答案:

答案 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()方法。