2011-08-12 5 views
3

SharedPreferencesインターフェイスのカスタム実装を使用して、アプリケーションの設定を(デフォルトのXMLではなく)データベースに保持しようとしています。AndroidカスタムSharedPreferencesの実装をデータベースに保持しますか?

なぜですか? PreferenceActivityという便利な機能を使ってUIを構築したいと思いますが、このアプリは複数のデバイスで使用されるため、ユーザーが設定するプリファレンスは複数のデバイスにまたがる必要があります。

私は実装を書いていますが、特定のSharedPreferenceをPreferenceActivityにどのように関連付けるのか分かりません。私はそれがgetSharedPreferences()を使用することを知っていますが、どのようにそれを無効にすることができますか?どういうわけか私はSharedPreferencesを登録できますか?私はこれを行うためにAPIで何も見ていませんでした。

...もし私がこれについて間違っているとすれば、私に知らせてください。ありがとう。

答えて

7

私はしばらく前にこの質問を調査しています。しかし別の理由で。私が見つけた何

PreferenceActivityは非常PreferenceManagerと結合され、それがSharedPreferenceインスタンスを取得するためにPreferenceManager.getDefaultSharedPreferences()心の奥底を使用していることです。 PreferenceManagerまたはSharedPreferenceというインスタンスをPrefernceActivityの代わりに使用する方法はありません。

私は、Preferenceフレームワークが柔軟性がなく、デフォルトの動作を拡張または変更することは非常に困難であり、場合によってはそれも不可能であることがわかりました。しかし、私の推測では、このフレームワークの設計者は、拡張性と柔軟性ではなく、「使いやすさ」を最優先に考えています。どちらが理解できる。

+0

これはまあまあです。返信いただきありがとうございます。私は自分の好みの画面を書かなければならないと思います。 – mkowske

+0

コードをコピーして、必要に応じて変更できます(元のパッケージ名をそのまま使用してください):http://codesearch.google.com/codesearch/p?hl=en#cZwlSNS7aEw/frameworks/base/core/java/ android/preference/PreferenceActivity.java&q = PreferenceActivity&exact_package =アンドロイド&type = cs – inazaruk

+1

私はそれをやり遂げることができたと思います。代わりに、PreferenceActivityの各Preferenceに対してOnPreferenceChangeListenerを設定します。呼び出されると、ユーザーがログアウトしたときにデータベースに保存される個別のデータ構造にプリファレンスが設定されます。 – mkowske

0

非常に特別な必要性を持っている研究の結果、「シンプルな」ソリューションがあります。

SharedPreferencesとEditorの両方をオーバーライドして独自の実装を提供する必要がある場合は、さまざまなpersistXXX()メソッドとgetPersistedXXX()メソッドをオーバーライドするようにすべてのプリファレンスを拡張する必要があります。

たとえば、CheckBoxPreferenceは、トリックを行うためにpersistBooleanとgetPersistedBooleanをオーバーライドできます。

ただ、PreferenceManagerクラスを拡張して各PreferenceクラスのgetPreferenceManager()をオーバーライドするだけでは不可能に思えます。

0

すべての設定をpersistent="false"(XMLまたはpreference.setPersistent(false)のコード内)に設定するだけで簡単に回避できます。次に、環境設定が変更されたときに通知を受け取り、ハンドラーにいくつかのカスタムデータベースの値を保存させるように、OnPreferenceChangeListenerを設定します。私は、Bluetoothデバイスに保存されている好みに取り組んでいます

Preference preference = findPreference(getString(R.string.pref1)); 
Preference.OnPreferenceChangeListener changeListener = new Preference.OnPreferenceChangeListener() { 
     @Override 
     public boolean onPreferenceChange(Preference preference, Object value) { 
      preference.setSummary((String)value + " something"); 

      // store value in custom database 
      store((String)value); 

      return true; 
     } 
    }; 
    preference.setOnPreferenceChangeListener(changeListener); 
    // update preference from custom database (once) 
    changeListener.onPreferenceChange(preference, getValueFromDatabase()); 
0

は、ここに私のコードです。

@Override 
public SharedPreferences getSharedPreferences (String name, int mode) { 
    return new MySharedPreferences(this); 
} 

MySharedPreferenceがandroid.content.SharedPreferencesインターフェイスの私の実装です:私のソリューションは、私の活動のgetSharedPreferencesメソッドをオーバーライドすることです。また、内部クラスを実装する必要があります。 MySharedPreferenceコンストラクタでは、アクティビティがパラメータとして渡され、メンバ変数に格納されます