AndroidのPreferenceActivityからSharedPreferencesを取得するにはどうすればよいですか?


373

アプリケーションの設定を表示するためにPreferenceActivityを使用しています。xmlファイルを介して設定を拡張して、onCreate(および完全なクラスメソッド)が次のようになるようにします。

public class FooActivity extends PreferenceActivity {
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        addPreferencesFromResource(R.xml.preference);
    }
}

PreferenceActivity PreferenceFragmentのjavadocには、

これらの設定は、ユーザーが操作したときに自動的にSharedPreferencesに保存されます。このアクティビティの設定階層が使用するSharedPreferencesのインスタンスを取得するには、このアクティビティと同じパッケージのコンテキストでgetDefaultSharedPreferences(android.content.Context)を呼び出します。

しかし、別のアクティビティでSharedPreferenceの名前を取得するにはどうすればよいですか?電話しかできない

getSharedPreferences(name, mode)

他のアクティビティでは、PreferenceActivityによって使用されたSharedPreferenceの名前が必要です。名前は何ですか、またはどのように取得できますか?

回答:


721
import android.preference.PreferenceManager;
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
// then you use
prefs.getBoolean("keystring", true);

更新

共有設定によると| サイゲータMNによるAndroid開発者チュートリアル(パート13)

多くのアプリケーションは、特定のアプリケーションまたはアクティビティの設定に関するユーザー設定をキャプチャする方法を提供する場合があります。これをサポートするために、AndroidはシンプルなAPIセットを提供しています。

プリファレンスは通常、名前と値のペアです。これらは、アプリケーションのさまざまなアクティビティ全体で「共有設定」として保存できます(現在、プロセス間で共有することはできません)。または、アクティビティに固有に保存する必要があるものにすることもできます。

  1. 共有設定:共有設定は、アプリケーションのすべてのコンポーネント(アクティビティ、サービスなど)で使用できます。

  2. アクティビティで処理される設定:これらの設定は特定のアクティビティ内でのみ使用でき、アプリケーションの他のコンポーネントでは使用できません。

共有設定:

共有設定はgetSharedPreferencesContextクラスのメソッドを使用して管理されます。プリファレンスはデフォルトファイルに保存されます(1)。または、プリファレンスの参照に使用するファイル名(2)を指定できます。

(1)推奨される方法は、ファイル名を指定せずにデフォルトモードで使用することです

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);

(2)ファイル名を指定してインスタンスを取得する方法は次のとおりです

public static final String PREF_FILE_NAME = "PrefFile";
SharedPreferences preferences = getSharedPreferences(PREF_FILE_NAME, MODE_PRIVATE);

MODE_PRIVATE設定の操作モードです。これはデフォルトのモードであり、作成されたファイルには呼び出し側のアプリケーションのみがアクセスすることを意味します。サポートされている他の2つのモードはMODE_WORLD_READABLEおよびMODE_WORLD_WRITEABLEです。ではMODE_WORLD_READABLE、他のアプリケーション作成したファイルを読み込むことができますが、それを変更することはできません。MODE_WORLD_WRITEABLE他のアプリケーションの場合、作成されたファイルに対する書き込み権限も持っています。

最後に、設定インスタンスを取得したら、保存されている値を設定から取得する方法を次に示します。

int storedPreference = preferences.getInt("storedInt", 0);

設定ファイルオブジェクトに格納するには、SharedPreference.Editor使用する必要があります。クラスEditor内のネストされたインターフェースSharedPreferenceです。

SharedPreferences.Editor editor = preferences.edit();
editor.putInt("storedInt", storedPreference); // value to store
editor.commit();

エディタはまた、のようなメソッドをサポートremove()してのclear()ファイルの設定値を削除します。

アクティビティ設定:

共有設定は、他のアプリケーションコンポーネントで使用できます。ただし、他のコンポーネントと設定を共有する必要がなく、アクティビティのプライベート設定が必要な場合getPreferences()は、アクティビティのメソッドを使用してそれを行うことができます。このgetPreferenceメソッドは、getSharedPreferences()設定ファイル名にアクティビティクラスの名前を持つメソッドを使用します。

以下は設定を取得するためのコードです

SharedPreferences preferences = getPreferences(MODE_PRIVATE);
int storedPreference = preferences.getInt("storedInt", 0);

値を格納するコードも、共有設定の場合と同じです。

SharedPreferences preferences = getPreference(MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();
editor.putInt("storedInt", storedPreference); // value to store
editor.commit();

データベースにアクティビティの状態を保存するなど、他の方法を使用することもできます。注Androidには、というパッケージも含まれていますandroid.preference。パッケージは、アプリケーション設定UIを実装するクラスを定義します。

さらにいくつかの例を確認するには、開発者サイトのAndroidのデータストレージに関する投稿を確認してください。


55
+1:uは私の日を保存しました。インターネット上のチュートリアル/例のいずれもこれについて教えていません。彼らはすべてabtの機能とカスタマイズについて話しますが、それを読む方法は話しません。
ankitjaininfo

1
私の回答の更新を参照してください。ファイル名は次のようなものですpackage.prefsが、よくわかりません。
Pentium10

1
コードをありがとう。混乱を招く小さなことが1つだけあります。SharedPreferenceはインターフェイスなので、メソッド呼び出しを処理する実際のコードはどこに実装されていますか?
x1886x 2011年

1
SE全体で愚かなオタクの回答/コメントを読んで時間を無駄にする1週間前にこれを読んだらいいのに。 :)
Sanjeevcn 2015年

1
editor.commit()を使用する代わりに、editor.apply()を使用することもできます。違いは、commit()が変更を同期的に書き込み、applyが非同期的に変更を書き込むことです。これにより、UIが高速になります。
Hashim Akhtar、2016

29

にアクセスできないgetDefaultSharedPreferenes()場合は、getSharedPreferences(name, mode)代わりに使用できます。正しい名前を渡すだけです。

Androidがこの名前を作成します(おそらくプロジェクトのパッケージ名に基づいていますか?)。次のコードをに入れて、それがSettingsActivity onCreate()何であるかを確認することで取得できますpreferencesName

String preferencesName = this.getPreferenceManager().getSharedPreferencesName();

文字列はのようになりますcom.example.projectname_preferences。あなたのプロジェクトのどこかにあるハードコード、そしてそれをそれに渡せば、getSharedPreferences()あなたは行ってもいいはずです。


1
アクティビティのソースは次のとおりです。public SharedPreferences getPreferences(int mode){return getSharedPreferences(getLocalClassName()、mode); }
2015年

22

最初にこれらのメソッドを宣言します。

public static void putPref(String key, String value, Context context) {
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
    SharedPreferences.Editor editor = prefs.edit();
    editor.putString(key, value);
    editor.commit();
}

public static String getPref(String key, Context context) {
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
    return preferences.getString(key, null);
}

次に、設定を行いたいときにこれを呼び出します。

putPref("myKey", "mystring", getApplicationContext());

あなたが好みを取得したいときにこれを呼び出します:

getPref("myKey", getApplicationContext());

または、 このオブジェクトhttps://github.com/kcochibili/TinyDB--Android-Shared-Preferences-Turbo を使用して、すべてをさらに簡素化することもできます

例:

TinyDB tinydb = new TinyDB(context);

tinydb.putInt("clickCount", 2);
tinydb.putFloat("xPoint", 3.6f);
tinydb.putLong("userCount", 39832L);

tinydb.putString("userName", "john");
tinydb.putBoolean("isUserMale", true); 

tinydb.putList("MyUsers", mUsersArray);
tinydb.putImagePNG("DropBox/WorkImages", "MeAtlunch.png", lunchBitmap);

editor.apply();を使用しないのはなぜですか。バックグラウンドで処理するためにコミットするのではなく
Avi Parshan

4

どこにでもコンテキストを渡さなければならないのは本当に私を困らせます。コードが冗長になり、扱いにくくなります。代わりに、すべてのプロジェクトでこれを行います...

public class global {
    public static Activity globalContext = null;

それをメインアクティビティのcreateに設定します

@Override
public void onCreate(Bundle savedInstanceState) {
    Thread.setDefaultUncaughtExceptionHandler(new CustomExceptionHandler(
            global.sdcardPath,
            ""));
    super.onCreate(savedInstanceState);

    //Start 
    //Debug.startMethodTracing("appname.Trace1");

    global.globalContext = this;

また、すべての設定キーは言語に依存しないものである必要があります。

getText(R.string.yourPrefKeyName).toString()

今、これを非常に簡単に1行のコードで呼び出します

global.globalContext.getSharedPreferences(global.APPNAME_PREF, global.MODE_PRIVATE).getBoolean("isMetric", true);

4
キーを言語に依存しないようにする利点は何ですか?ユーザーに表示されることはありませんよね?
Gerd

1
神の愛のために、アクティビティをグローバルコンテキストとして使用しないでください。グローバルコンテキストを使用する必要がある場合は、カスタムアプリケーションクラスを使用してください。
Thorben

1
@ソーベンは同意した。または単にgetApplicationContext()
OneCricketeer 2016年

3

チェックボックスがあり、その値をフェッチしたい場合、つまり任意のJavaファイルでtrue / false-

使用する -

Context mContext;
boolean checkFlag;

checkFlag=PreferenceManager.getDefaultSharedPreferences(mContext).getBoolean(KEY,DEFAULT_VALUE);`

0

2019年更新

あなたは単にPowerPreferenceライブラリを使用することができます

https://github.com/AliEsaAssadi/Android-Power-Preference

共有設定インスタンスを取得する

デフォルトのインスタンスを取得するには、呼び出すだけです

PowerPreference.getDefaultFile()

または、特定の設定ファイルが必要な場合

PowerPreference.getFileByName(fileName)

データの書き込み:

PowerPreference.getDefaultFile().put(key,value)

データを取得する

PowerPreference.getDefaultFile().getString(key,value)

PowerPreferenceはコンテキスト部分をどのように処理しますか?共有設定を読み取るにはコンテキストが必要です。私はAndroidを初めて使い、理解しようとしています。
イエティ

0

それが私のために働いたソースコードに従ってください

//Fetching id from shared preferences
    SharedPreferences sharedPreferences;
    sharedPreferences =getSharedPreferences(Constant.SHARED_PREF_NAME, Context.MODE_PRIVATE);
    getUserLogin = sharedPreferences.getString(Constant.ID_SHARED_PREF, "");
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.