別のアクティビティで変更が発生した場合、onSharedPreferenceChanged は実行されませんか? 質問する

別のアクティビティで変更が発生した場合、onSharedPreferenceChanged は実行されませんか? 質問する

onSharedPreferenceChanged私の主な活動に実装しました。

メインアクティビティの設定を変更すると、イベントが起動します。

設定画面 ( PreferenceActivity) から設定を変更した場合、設定が変更されてもイベントは発生しません (別のアクティビティであり、sharedPreferences への別の参照であるためでしょうか)。

この状況を克服するにはどうしたらよいか、誰かアドバイスをいただけませんか?

ありがとう!

編集1: 設定アクティビティにイベント ハンドラーを追加しようとしましたが、起動しません。次のメソッドは、設定アクティビティの onCreate 中に呼び出されます。値を変更しても、メッセージ (msg()は のラッパーですLog.d) は出力されません。

private void registerChangeListener () {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);

    sp.registerOnSharedPreferenceChangeListener(new OnSharedPreferenceChangeListener () {
        public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
            msg (" ***** Shared Preference Update ***** ");
            Intent i = new Intent();
            i.putExtra("KEY", key);
            i.setAction("com.gtosoft.dash.settingschanged");

            sendBroadcast(i);

            // TODO: fire off the event
        }
    });
}

ベストアンサー1

OnSharedPreferenceChangeListener匿名クラスを使用すると、ガベージ コレクションが行われます。

この問題を解決するには、次のコードを使用してPreferenceActivity変更リスナーを登録および登録解除します。

public class MyActivity extends PreferenceActivity implements
    OnSharedPreferenceChangeListener {

@Override
protected void onResume() {
    super.onResume();
    // Set up a listener whenever a key changes
    getPreferenceScreen().getSharedPreferences()
            .registerOnSharedPreferenceChangeListener(this);
}

@Override
protected void onPause() {
    super.onPause();
    // Unregister the listener whenever a key changes
    getPreferenceScreen().getSharedPreferences()
            .unregisterOnSharedPreferenceChangeListener(this);
}

public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,String key) 
{
  // do stuff
}

さらに、リスナーは実際の値が変更された場合にのみ呼び出されることに注意してください。同じ値を再度設定しても、リスナーは起動されません。

参照SharedPreferences.onSharedPreferenceChangeListener が一貫して呼び出されない

おすすめ記事