私はAndroidでスイッチ設定を機能させようとしてきました。これにより、場合によっては、スイッチのオン/オフを切り替えるときと、設定全体をクリックするときで、インターセプトと処理を変えることができます。
これが私が達成しようとしていることです:ユーザーが設定に入るタグはオフでタグは保存されません(つまり、タグ設定は空です)ユーザーはタグの設定をオンにし、現在タグが保存されていないため、タグ検索アクティビティを開始しますユーザーがタグを見つけるために。- 正常に動作します。
タグがすでに存在し、状態のみが変更される場合は、通常どおり値を更新します。- 正常に動作します
私の問題は次のとおりです。設定をクリックし、すでにタグが保存されている場合は、状態を変更せずに(有効か無効かに関係なく)、タグ検索アクティビティを起動します。-これは機能しません。
これまでのところ、上記の最後のシナリオでは、onPreferenceChangedが呼び出され、続いてonPreferenceClickedが呼び出され、続いてonPreferenceChangedが呼び出されます。これが私の問題のようです。onPreferenceChangedを最初に呼び出すと、SharedPreferencesのリスナーが呼び出され、有効になったことを通知します。
onPreferenceChangedへの最初の呼び出しを受け取らなかった場合、問題は発生しません。
これが私がリスナーを設定している関連部分です
SwitchPreference tagPref = (SwitchPreference) findPreference(PreferencesConstants.PREFERENCE_TAG_ENABLED);
tagPref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
Log.e("BLAH", "onPrefChanged....is it handled by OnClick?" + Boolean.toString(handledByClick));
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity().getApplicationContext());
boolean enabled = prefs.getBoolean(PreferencesConstants.PREFERENCE_TAG_ENABLED, false);
Log.e("BLAH", "value stored in prefs? " + Boolean.toString(enabled));
if (newValue instanceof Boolean) {
enabled = (Boolean) newValue;
}
Log.e("BLAH", "New value? " + Boolean.toString(enabled));
if (!handledByClick) {
if (enabled && (currentTag == null || currentTag.isEmpty())) {
Log.e("BLAH", "Enabled and CurrentTag empty!");
Intent intent = new Intent(getActivity(), TagSearchActivity.class);
startActivityForResult(intent, 0);
return false; // always return false, we'll handle
// updating
// this value manually.
} else {
return true;
}
}
Log.e("BLAH", "returning false (AS IN WE HANDLED IT).");
return false;
}
});
tagPref.setOnPreferenceClickListener(new OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
handledByClick = true;
Log.e("BLAH", "onprefClick");
Intent intent = new Intent(getActivity(), TagSearchActivity.class);
startActivityForResult(intent, 0);
return true;
}
});
保存されたタグを使用して実行し、設定をクリックした後の関連するログ行は次のとおりです。
01-18 15:55:05.593: E/BLAH(13261): onPrefChanged....is it handled by OnClick?false
01-18 15:55:05.593: E/BLAH(13261): value stored in prefs? true
01-18 15:55:05.593: E/BLAH(13261): New value? false
01-18 15:55:05.613: E/DifferentClass(13261): On Shared Preferences Changed - tagEnabled
01-18 15:55:05.652: E/DifferentClass(13261): disabled TAG in cancelAlarmService
01-18 15:55:05.662: E/AnotherClass(13261): Updating Feed List. Old Size: 33, New Size: 14
01-18 15:55:05.682: E/BLAH(13261): onprefClick
01-18 15:55:05.812: E/BLAH(13261): onPrefChanged....is it handled by OnClick?true
01-18 15:55:05.812: E/BLAH(13261): value stored in prefs? false
01-18 15:55:05.822: E/BLAH(13261): New value? false
01-18 15:55:05.822: E/BLAH(13261): returning false (AS IN WE HANDLED IT).