1

共有設定のリスナーを実装するアクティビティがあるので、ユーザーがFragmentPrefsをプルアップして値を変更すると、onSharedPreferenceChanged(SharedPreferences prefs、String key)が呼び出されます。

SharedPreferences prefs;
OnSharedPreferenceChangeListener listener;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    prefs = PreferenceManager.getDefaultSharedPreferences(this);
    registerPreferenceListener();
}

private void registerPreferenceListener()
{
    listener = new SharedPreferences.OnSharedPreferenceChangeListener() {
    public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {

    Debug.out("LISTENING! - Pref changed for: " + key + " pref: " +
    prefs.getString(key, null) );
      }
    };

    prefs.registerOnSharedPreferenceChangeListener(listener);
}

問題は、コードに悪臭を発生させることなく、設定が変更されたイベントを適切に処理する方法を見つけようとしていることです。

管理する必要のある設定がかなりあるので、ネストされたIF ELSEステートメントを使用すると、時間がかかり、面倒になります。ポリモーフィズムの実装について考えましたが、それは問題なく機能しますが、呼び出すクラスの実装を決定するためにif/elseが必要です。

changePrefメソッドはキー識別子として文字列を使用しますが、R.string.pref_nameを参照できるので、スイッチの方が優れている可能性があります。

私は物事を複雑にしすぎていますか、それとも些細なことを見逃していますか?

ありがとう。

4

2 に答える 2

2

ネストされたIF-ELSEではありません。これは、文字列パラメータを評価する必要がある場合に使用する通常のIF-ELSE構造です。それは何も悪いことではありません。それ以外のものは間違いなく過度に複雑です。

if (key.equals(PREFS_KEY_A)) {
    ...
} else if (key.equals(PREFS_KEY_B)) {
    ...
} else if (key.equals(PREFS_KEY_C)) {
    ...
}
于 2012-07-06T10:44:26.153 に答える
1

if / elseに問題はありません。それを回避できるかどうかは、わかりません。結局のところ、どのアイテムが来るかを確認する必要があります。ポリモーフィズムの方が見栄えがよいかもしれませんが、Androidでオブジェクトを作成すると、デスクトップよりもコストがかかることに注意してください。したがって、パフォーマンスのために醜いコードの価値がある場合があります(注:静的メソッドを使用して新しいメソッドを回避できる場合を除きます)。

于 2012-07-06T10:42:19.250 に答える