21

プリファレンスをpreferences1.xmlpreferences2.xmlの2つのファイルに保存するアプリケーションがあるとします。次に、次のコードを使用して、対応するオブジェクトへの参照を取得できます。

SharedPreferences sharedPrefs1 = getSharedPreferences("preferences1", MODE_PRIVATE);
SharedPreferences sharedPrefs2 = getSharedPreferences("preferences2", MODE_PRIVATE);

このようにして、両方の設定を操作し、両方の変更についてリスナーを登録できます。

setDefaultValuesを使用したこれら2つのファイルの初期化について疑問があります。

質問1-PreferenceFragmentコンテキスト:2つのPreferenceFragmentsを使用してPreferenceActivityを作成し、それぞれのonCreateメソッド内で次のコードを実行します(フラグメント1と2のXを1と2に置き換えます)。

PreferenceManager pm = getPreferenceManager();
pm.setSharedPreferencesName("preferencesX");

PreferenceManager.setDefaultValues(getActivity(),R.xml.preference_fragmentX, false);

両方のフラグメントが起動時にデフォルト値で設定を正しく設定していることを確認しました。ただし、アプリのshared_prefsディレクトリにある_has_set_default_values.xmlファイルは1つしか表示されないため、 Preferences1.xmlpreferences2.xmlはすでに設定されていますか?このファイルは、最初に開いたPreferenceFragmentでsetDefaultValuesが呼び出されるとすぐに作成されますが、その後でも、2番目のPreferenceFragmentを開くと、デフォルト値が正しく初期化されます。まだpreferences2.xmlが初期化されていないことをどのように理解し、その目的は何ですか_has_set_default_values.xmlには、初期化された優先ファイルに関する情報が含まれていないという事実がありますか?

質問2-標準アクティビティコンテキスト:アプリを起動したとき、PreferenceActivityは最初に開始されたアクティビティではなく、ユーザーがそれを開くことはない可能性があるため、メインのアクティビティでも2つの設定ファイルをデフォルト値で初期化します。どうやってやるの?デフォルトの共有設定の場合、それは簡単です。

PreferenceManager.setDefaultValues(this, R.xml.default_preferences, false); 

2つの設定ファイルの場合、どうすればよいですか?PreferenceFragmentクラスのようにPreferenceManagerのインスタンスを取得できないため、次のようなことはできません。

PreferenceManager pm = getPreferenceManager(); // NOT AVAILABLE AND NOT WANTED
pm.setSharedPreferencesName("preferences1");
PreferenceManager.setDefaultValues(getActivity(),R.xml.preference_fragment1, false);

PreferenceManager pm = getPreferenceManager(); // NOT AVAILABLE AND NOT WANTED
pm.setSharedPreferencesName("preferences2");            
PreferenceManager.setDefaultValues(getActivity(),R.xml.preference_fragment2, false);

ここでメインアクティビティでは、 PreferenceManagerが機能する設定ファイルを変更する必要はありません。これは、PreferenceActivityに含まれていないため、これら2つのファイルを初期化するだけです...何か助けはありますか?長すぎても、明確な質問を投稿したと思います。

4

3 に答える 3

1

次のような設定を作成できます。

public class MyPreference {

    private static final String APP_SHARED_PREFS1 = "myPrefc1"; 
    private static final String APP_SHARED_PREFS2 = "myPrefc2"; 
    private SharedPreferences   appSharedPrefs1;
    private SharedPreferences   appSharedPrefs2;
    private Editor              prefsEditor1;
    private Editor              prefsEditor2;


    public MyPreference(Context context) {
        this.appSharedPrefs1 = context.getSharedPreferences(APP_SHARED_PREFS1, Activity.MODE_PRIVATE);
        this.appSharedPrefs2 = context.getSharedPreferences(APP_SHARED_PREFS2, Activity.MODE_PRIVATE);
        this.prefsEditor1 = appSharedPrefs1.edit();
        this.prefsEditor2 = appSharedPrefs2.edit();
    }

 public void saveServices(String servicName, boolean isActivated) {
        prefsEditor1.putBoolean(servicName, isActivated);
        prefsEditor1.commit();
        prefsEditor2.putBoolean(servicName, isActivated);
        prefsEditor2.commit();
    }

保存サービスまたは好みでやりたいことで、データは両方のファイルに保存されます。

そしてあなたの2番目の質問について:

次のようなグローバルクラスを作成しますG

次に、次のように設定を宣言します。

public class G extends Application{

    public static Activity currentActivity = null;
    public static MyPreference myAppPref = null;


    @Override
    public void onCreate() {

        super.onCreate();

         myAppPref = new MyPreference(G.this);


    }


}

メインアクティビティが実行されるときは、次のようにする必要があります。

G.currentActivity = MainActivity.this;
G. myAppPref.saveServices("testpref", true);
于 2014-02-22T13:22:03.030 に答える
0

質問 1 の場合

_has_set_default_values.xmlファイルは単なる別の設定ファイルだと思います...そして、キーと値のペアをそこに保存します。キーは設定ファイルの名前であり、値はデフォルト値が設定されているかどうかです。

質問 2 の場合

共有設定ファイルの名前を取るバージョンのPreferenceManager.setDefaultValues()を使用しないのはなぜですか? これはメソッド シグネチャです。

public static void setDefaultValues (Context context, String sharedPreferencesName, int sharedPreferencesMode, int resId, boolean readAgain)

http://developer.android.com/reference/android/preference/PreferenceManager.html

于 2014-02-03T19:26:16.787 に答える
-3

1)これらのデフォルト値は、getDefaultSharedPreferences()メソッドが使用されている場合にのみ読み込まれ、独自の設定ファイルを指定した場合は無視されると思います。これについてはよくわかりません。

2)それらをApplicationサブクラスに設定できます。

http://developer.android.com/reference/android/app/Application.html

Application.onCreateは、ユーザーがアプリを起動したときに最初に実行されるものです。これはアプリへの単一の入り口であるため、アプリがシステム全体で必要とするすべてのデータを初期化するのに適した場所です。

アプリケーションはContextWrapperを拡張するため、getSharedPreferences(file、mode)メソッドを介してSharedPreferencesにアクセスできます。これを使用して、2つの設定ファイルを取得できます。

于 2012-11-16T03:49:32.117 に答える