42

タイトルが示すように、特定の文字列を保存して取得したいです。しかし、私のコードは取得でも保存でも最初の行を通過しません。このリンクをたどろうとしました: http://developer.android.com/guide/topics/data/data-storage.html

private void savepath(String pathtilsave, int i) {
    String tal = null;
    // doesn't go past the line below
    SharedPreferences.Editor editor = getPreferences(MODE_PRIVATE).edit();
    tal = String.valueOf(i);
    editor.putString(tal, pathtilsave);
    editor.commit();
}

そして私の取得方法:

public void getpaths() {
    String tal = null;
    // doesn't go past the line below
    SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
    for (int i = 1; i <= lydliste.length - 1; i++) {
        tal = String.valueOf(i);
        String restoredText = settings.getString(tal, null);
        if (restoredText != null) {
            lydliste[i] = restoredText;
        }
    }
}

lydliste は静的文字列配列です。PREFS_NAME

public static final String PREFS_NAME = "MyPrefsFile";
4

7 に答える 7

89

プリファレンスに保存するには:

PreferenceManager.getDefaultSharedPreferences(context).edit().putString("MYLABEL", "myStringToSave").apply();  

保存された設定を取得するには:

PreferenceManager.getDefaultSharedPreferences(context).getString("MYLABEL", "defaultStringIfNothingFound"); 

contextあなたの文脈はどこにありますか。


複数の値を取得している場合は、同じインスタンスを再利用する方が効率的かもしれません。

 SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
 String myStrValue = prefs.getString("MYSTRLABEL", "defaultStringIfNothingFound");
 Boolean myBoolValue = prefs.getBoolean("MYBOOLLABEL", false);
 int myIntValue = prefs.getInt("MYINTLABEL", 1);

複数の値を保存する場合:

Editor prefEditor = PreferenceManager.getDefaultSharedPreferences(context).edit();
prefEditor.putString("MYSTRLABEL", "myStringToSave");
prefEditor.putBoolean("MYBOOLLABEL", true);
prefEditor.putInt("MYINTLABEL", 99);
prefEditor.apply();  

注:apply()を使用するよりも、 を使用して保存することをお勧めしcommit()ます。commit()必要なのは戻り値が必要な場合だけですが、これは非常にまれです。

于 2012-08-22T13:25:51.277 に答える
10
private static final String PREFS_NAME = "preferenceName";

public static boolean setPreference(Context context, String key, String value) {
    SharedPreferences settings = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = settings.edit();
    editor.putString(key, value);
    return editor.commit();
}

public static String getPreference(Context context, String key) {
    SharedPreferences settings = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
    return settings.getString(key, "defaultValue");
}
于 2012-08-22T13:27:33.217 に答える
5

解決しました!クラス内からメソッドを呼び出したときに機能しませんでした。何らかの理由で別のクラスから呼び出す必要があり、「classname.this」をContextパラメーターとして記述しました。最終的な作業は次のとおりです。

SharedPreferences settings = ctx.getSharedPreferences(PREFS_NAME, 0);
    settings = ctx.getSharedPreferences(PREFS_NAME, 0);
    SharedPreferences.Editor editor = settings.edit();
    editor.putString(tal, pathtilsave);
     editor.commit(); 
于 2012-08-22T23:01:41.493 に答える
3

commit() の戻り値を気にしない場合は、非同期である方が commit() よりも高速であるため、apply() を使用することをお勧めします。

final SharedPreferences prefs =  context.getSharedPreferences("PREFERENCE_NAME",
                Context.MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
editor.putString("key", "value");
editor.apply();

ドキュメントに従って

設定を永続ストレージに同期的に書き込む commit() とは異なり、apply() は変更をメモリ内の SharedPreferences にすぐにコミットしますが、ディスクへの非同期コミットを開始するため、失敗は通知されません。この SharedPreferences の別のエディターが通常の commit() を実行し、apply() がまだ未解決の場合、commit() はすべての非同期コミットとコミット自体が完了するまでブロックされます。

于 2015-10-28T18:41:46.993 に答える
3

コンテキストで試してください:

final SharedPreferences settings = context.getSharedPreferences(
            PREFS_NAME, 0);

return settings.getString(key, null);
于 2012-08-22T13:25:50.457 に答える