2017-02-17 5 views
4

私のアプリケーションでは、「pref1」に0,1,2の値を設定できます。私はSharedPreferencesクラスの助けを借りてそれらを保持しています。PreferenceFragmentとアーキテクチャの使用

  1. そして、私はそれを変更するためのユーザーインターフェイスを提供したいと思います。 クラスを作成し、PreferenceScreenルートのxmlファイルを作成します。 XMLファイルでは、android:keyフィールドをUIにバインドし、SharedPreferencesを設定する必要があります。

  2. ユーザーが "pref1"を変更した後にアプリケーションの動作を変更するには、OnSharedPreferenceChangeListenerを実装する必要があります。

  3. また、プログラムの開始時に、私は "pref1"の値を得る必要があります。 は、保存された設定に従ってプログラムの状態を同期させる必要があります。

私のアプリケーションの設定の追加/削除/変更の単位を変更する必要があるため、3つの場所があります。悪く見える。別のオプションは、SharedPreferencesタイプのメンバ変数を持つclassを作成し、SharedPreferencesのすべてのキーを隠し、簡単な設定/取得メソッドを使用して設定を取得することです。しかし、この場合、私はアンドロイドUIのための通常のツールを使用する必要があります:レイアウト。

を使用して、嗜好ストレージの内部構造(キーの名前、デフォルト値、タイプ)を複数の場所に広げずに、通常のレイアウトを使用する方法はありますか?

+0

あなたの質問は少しばかりです。あなたが言及した3つのステップは、SharedPreferenceベースの設定で作業するために不可欠です。最初のステップはUIステップであり、実装固有のものですが、2番目のパートは潜在的なリスナーに通知します。私は第3のポイントであなたが何を意味したのか分かりません。また、もう少しあなたの質問を明確にしようとすることができますか? – Dibzmania

+0

@Dibzmania私の質問を更新します、これが助けてくれるといいですね – user1244932

答えて

2

あなたの質問で既に強調表示されているように、SharedPreferenceに基づく設定を持つ3つの部分が定義されています - 1.ユーザーが設定を見たり変更するためのUIレイアウト。 2.設定の変更を聞きます。 3. UIを初期化するときに設定を読み取ります。

あなたの機能に影響を与えることなく、実際にはパーツのいずれかを削除することはできません。しかし、新しい設定を追加するときに修正する必要があるファイル(またはコード内の場所)の数を最小限に抑えるように、コードを並べ替えることができます。 UI building部分を削除することはできません。しかし、リッスンと設定値の読み込みは、グローバルにアクセス可能なシングルトン(あなたのどこからでも)でラップすることができます。あなたはあなたのAppが初期化され、単純なset/getインタフェースを持つことができるときに、この単一インスタンスを初期化することができます。変更を聞くことができるように、何らかのインターフェースを定義する必要があります。シングルトンクラスに、これらのインタフェースを設定/削除するためのAPIがあるようにします。消費者はこれらのインタフェースを設定/削除することができ、インタフェースの外観を決めることができます。

0

PreferenceFragmentのプリファレンスに別の共有プリファレンスキーを持つ必要はありません。 Androidフレームワークは、永続的(android:persistent = true)として指定した場合、自動的に共有設定に保存されます。デフォルトでは、永続フラグはtrueです。 ドキュメントごと:

PreferenceFragmentは、Preferenceオブジェクトの階層をリストとして示しています。 これらの設定は、 ユーザが対話するときにSharedPreferencesに自動的に保存されます。あなたのケースでは

あなたはDEFAULTVALUEはentryvalues_list_preference要素である必要があり、リストの優先

<ListPreference 
      android:key="pref1" 
      android:title="title" 
      android:summary="description" 
      android:entries="@array/entries_list_preference" 
      android:entryValues="@array/entryvalues_list_preference" 
      android:defaultValue="1" 
      android:dialogTitle="dialog title" /> 

注意を使用することができます。

環境設定値が に変更されたときに、特定の機能を実行する必要がある場合は、環境設定変更リスナーを追加する必要があります。

ListPreference preference1 =(ListPreference)findPreference( "pref1");

ListPreference preference1 = (ListPreference) findPreference ("pref1"); 

    performAction(preference1.getValue()); 
    preference1.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { 
    /** 
    * Called when a Preference has been changed by the user. This is 
    * called before the state of the Preference is about to be updated and 
    * before the state is persisted. 
    * 
    * @param preference The changed Preference. 
    * @param newValue The new value of the Preference. 
    * @return True to update the state of the Preference with the new value. 
    */ 
     @Override 
     public boolean onPreferenceChange(Preference preference, Object newValue) { 
      performAction(String.valueOf(newValue)); 
      return true; 
     } 
    }); 

private void performAction(String type) { 
    switch (type){ 
     case "0": // when 0 value is selected 

      break; 
     case "1": //when 1 value is selected 

      break; 
     case "2": //when 2 value is selected 

      break; 
    } 
} 

あなたは好みにカスタム操作を必要としない場合は、あなただけの追加/環境設定xmlファイルで削除して、Androidのフレームワークがあなたのためにそれを処理するよう好みの初期化/ updation心配べきではありませんする必要があります。

+0

'ListPreference'は' String'のみになります。私の質問で言及したように、私は0,1,2、 'int'を別の言葉で持っています。いくつかの特別なコードは決してありません。また、プログラムの開始時に、例えば '== 1 'の設定でブルートゥース接続を開始すると、アンドロイドは自動的にそれをやりますか? – user1244932

+0

いいえ、あなたはそれらの部分を処理する必要があります。 Androidフレームワークは状態を保存するだけです。私の答えを編集しました – abhishesh

関連する問題