2 つの異なるアクティビティから呼び出される共有設定を実装しようとしています。設定の 1 つは、アクティビティの 1 つの xml レイアウト ファイルに含まれるボタンを表示または非表示にするチェックボックスです。
このシナリオは、以下を使用して実装されます。
public class MyPreferencesActivity extends PreferenceActivity
implements OnSharedPreferenceChangeListener { ... }
また、MyPreferencesActivity クラスには、次のような設定変更コードがあります。
@Override
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
Button btnClear = (Button) findViewById(R.id.clearbuttonid);
if (prefs.getBoolean("Clear User Flag", true))
btnClear.setVisibility(View.VISIBLE);
else
btnClear.setVisibility(View.INVISIBLE);
}
設定クラスには次のものもあります。
@Override
protected void onResume() {
super.onResume();
getPreferenceScreen().getSharedPreferences().
registerOnSharedPreferenceChangeListener(this);
}
... onPause() で同様にリスナーの登録を解除します。
書かれているように、clearbuttonid は別のアクティビティの xml レイアウト ファイルで定義されているため、このコードが機能するとはまったく予想していませんでした。ご想像のとおり、btnClear にアクセスしようとすると、共有設定が変更されたコードで null ポインター例外が発生します。しかし、奇妙なことは、それに関する他のすべてが正しく機能することです (?!)。つまり、アプリを再起動すると、設定チェック ボックスが変更され、対応するコードが実行されます。
実際の問題は、2 つの異なるアクティビティから設定を呼び出し、そのうちの 1 つの変数を変更するという単純な目標をサポートする設定コードをどのように設定すればよいかということです。どうもありがとう。
編集>> Raju のリクエストによると、logcat は次のとおりです。
04-27 00:26:57.989: I/onSharedPreferenceChange(537): Shared preference changed
04-27 00:26:57.989: D/AndroidRuntime(537): Shutting down VM
04-27 00:26:57.989: W/dalvikvm(537): threadid=1: thread exiting with uncaught exception (group=0x409c01f8)
04-27 00:26:58.029: E/AndroidRuntime(537): FATAL EXCEPTION: main
04-27 00:26:58.029: E/AndroidRuntime(537): java.lang.NullPointerException
04-27 00:26:58.029: E/AndroidRuntime(537): at com.xyzzy.prototype.MyPreferencesActivity.onSharedPreferenceChanged(MyPreferencesActivity.java:49)
04-27 00:26:58.029: E/AndroidRuntime(537): at android.app.SharedPreferencesImpl$EditorImpl.notifyListeners(SharedPreferencesImpl.java:455)
04-27 00:26:58.029: E/AndroidRuntime(537): at android.app.SharedPreferencesImpl$EditorImpl.apply(SharedPreferencesImpl.java:365)
04-27 00:26:58.029: E/AndroidRuntime(537): at android.preference.Preference.tryCommit(Preference.java:1339)
04-27 00:26:58.029: E/AndroidRuntime(537): at android.preference.Preference.persistBoolean(Preference.java:1605)
04-27 00:26:58.029: E/AndroidRuntime(537): at android.preference.TwoStatePreference.setChecked(TwoStatePreference.java:79)
04-27 00:26:58.029: E/AndroidRuntime(537): at android.preference.TwoStatePreference.onClick(TwoStatePreference.java:68)
04-27 00:26:58.029: E/AndroidRuntime(537): at android.preference.Preference.performClick(Preference.java:939)
04-27 00:26:58.029: E/AndroidRuntime(537): at android.preference.PreferenceScreen.onItemClick(PreferenceScreen.java:202)
04-27 00:26:58.029: E/AndroidRuntime(537): at android.widget.AdapterView.performItemClick(AdapterView.java:292)
04-27 00:26:58.029: E/AndroidRuntime(537): at android.widget.AbsListView.performItemClick(AbsListView.java:1058)
04-27 00:26:58.029: E/AndroidRuntime(537): at android.widget.AbsListView$PerformClick.run(AbsListView.java:2514)
04-27 00:26:58.029: E/AndroidRuntime(537): at android.widget.AbsListView$1.run(AbsListView.java:3168)
04-27 00:26:58.029: E/AndroidRuntime(537): at android.os.Handler.handleCallback(Handler.java:605)
04-27 00:26:58.029: E/AndroidRuntime(537): at android.os.Handler.dispatchMessage(Handler.java:92)
04-27 00:26:58.029: E/AndroidRuntime(537): at android.os.Looper.loop(Looper.java:137)
04-27 00:26:58.029: E/AndroidRuntime(537): at android.app.ActivityThread.main(ActivityThread.java:4424)
04-27 00:26:58.029: E/AndroidRuntime(537): at java.lang.reflect.Method.invokeNative(Native Method)
04-27 00:26:58.029: E/AndroidRuntime(537): at java.lang.reflect.Method.invoke(Method.java:511)
04-27 00:26:58.029: E/AndroidRuntime(537): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
04-27 00:26:58.029: E/AndroidRuntime(537): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
04-27 00:26:58.029: E/AndroidRuntime(537): at dalvik.system.NativeStart.main(Native Method)
04-27 00:26:58.599: I/dalvikvm(537): threadid=3: reacting to signal 3
04-27 00:26:58.618: I/dalvikvm(537): Wrote stack traces to '/data/anr/traces.txt'