onSharedPreferenceChangedは、別のアクティビティで変更が発生した場合、発生しないのですか?
2023-11-14 21:40:01
質問
私が実装した
onSharedPreferenceChanged
をメインアクティビティに実装しました。
メインアクティビティでプリファレンスを変更すると、私のイベントが発生します。
環境設定画面で環境設定を変更した場合(
PreferenceActivity
で変更した場合、私のイベントは発生しません (別のアクティビティであり、sharedPreferences への参照も別であるため?)。
どなたか、この状況を克服するためにどのようにしたらよいか、推奨事項をお持ちですか?
ありがとうございます。
EDIT1: イベントハンドラをプリファレンスアクティビティに追加してみましたが、一度も起動しませんでした。次のメソッドは、私のプリファレンス・アクティビティの 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
}
});
}
どのように解決するのですか?
この
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 が一貫して呼び出されていない。
関連
-
[解決済み] 設定ページに移動せずに位置情報サービスをオンにする
-
[解決済み] Android Debug Bridgeでアプリケーションのインストール時にINSTALL_FAILED_VERSION_DOWNGRADEを無視する方法はありますか?
-
[解決済み] Android - タイトルバーに戻るボタンが表示される
-
[解決済み] getApplication()、getApplicationContext()、getBaseContext()、someClass.thisの違いと使い分け。
-
[解決済み] handler.postDelayed()を停止する。
-
[解決済み] Android Navigation Architecture Component - 現在表示されているフラグメントを取得する
-
[解決済み] アプリ内課金テスト:android.test.purchased already owned
-
[解決済み] AndroidでTextViewの下にアンダーラインを引くには
-
[解決済み] ProjectScopeServices に Factory タイプのサービスはありません。
-
[解決済み] アダプタからActivityメソッドを呼び出す
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】SharedPreferences.onSharedPreferenceChangeListenerが一貫して呼び出されない。
-
[解決済み] BottomSheetDialogFragmentの状態をexpandedに設定する。
-
[解決済み] ViewPagerのアイテムを強制的に再インスタンス化する方法 [重複].
-
[解決済み] Android: ランドスケープモード用の代替レイアウト xml
-
[解決済み] 複数のフィルタを持つBroadcastReceiverか、複数のBroadcastReceiverか?
-
[解決済み] AndroidでTextViewの下にアンダーラインを引くには
-
[解決済み] react nativeアプリのバージョン番号を更新する方法
-
[解決済み] RecyclerViewのアイテムに波及効果を追加する
-
[解決済み] PendingIntentの "requestCode "は何に使うのですか?
-
[解決済み] Androidでツールバーの戻るボタンの色を変えるには?