Android'de bir PreferenceActivity'den SharedPreferences'ı nasıl edinebilirim?


373

Uygulamam için bazı ayarları göstermek için bir PreferenceActivity kullanıyorum. Benim onCreate (ve tam sınıf yöntemleri) şöyle görünüyor böylece ayarları bir xml dosyası üzerinden şişirme:

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

Bir Javadoc PreferenceActivity PreferenceFragment belirtmektedir

Bu tercihler, kullanıcı onlarla etkileşime girerken otomatik olarak SharedPreferences'a kaydedilecektir. Bu aktivitedeki tercih hiyerarşisinin kullanacağı bir SharedPreferences örneğini almak için, bu aktiviteyle aynı paketteki bir bağlamda getDefaultSharedPreferences (android.content.Context) öğesini çağırın.

Ancak başka bir etkinlikte SharedPreference adını nasıl alabilirim? Sadece arayabilirim

getSharedPreferences(name, mode)

diğer aktivitede ancak PreferenceActivity tarafından kullanılan SharedPreference ismine ihtiyacım var. Adı nedir veya nasıl alabilirim?

Yanıtlar:


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

Güncelleme

Paylaşılan Tercihlere Göre | Sai Geetha MN tarafından Android Geliştirici Eğitimi (Bölüm 13) ,

Birçok uygulama, belirli bir uygulamanın veya etkinliğin ayarlarındaki kullanıcı tercihlerini yakalamak için bir yol sağlayabilir. Bunu desteklemek için Android, basit bir API seti sunar.

Tercihler genellikle ad değeri çiftleridir. Bir uygulamadaki çeşitli etkinlikler arasında “Paylaşılan Tercihler” olarak saklanabilirler (şu anda işlemler arasında paylaşılamayacağını unutmayın). Veya bir etkinliğe özgü saklanması gereken bir şey olabilir.

  1. Paylaşılan Tercihler: Paylaşılan tercihler, uygulamaların tüm bileşenleri (etkinlikler, hizmetler vb.) Tarafından kullanılabilir.

  2. Etkinlikle ilgili tercihler: Bu tercihler yalnızca belirli bir etkinlik dahilinde kullanılabilir ve uygulamanın diğer bileşenleri tarafından kullanılamaz.

Paylaşılan Tercihler:

Paylaşılan tercihler getSharedPreferences, Contextsınıfın yöntemi yardımıyla yönetilir . Tercihler varsayılan bir dosyada (1) saklanır veya tercihlere başvurmak için kullanılacak bir dosya adı (2) belirtebilirsiniz .

(1) Önerilen yol , dosya adını belirtmeden varsayılan modda kullanmaktır

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);

(2) Dosya adını belirttiğinizde örneği nasıl alacağınız aşağıda açıklanmıştır

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

MODE_PRIVATEtercihler için çalışma modudur. Varsayılan moddur ve oluşturulan dosyaya yalnızca çağıran uygulama tarafından erişileceği anlamına gelir. Desteklenen diğer iki mod MODE_WORLD_READABLEve MODE_WORLD_WRITEABLE. Gelen MODE_WORLD_READABLEbaşka bir uygulama oluşturulan dosyayı okuyabilir ancak bunu değiştiremez. Durumunda MODE_WORLD_WRITEABLEdiğer uygulamalar da oluşturulan bir dosya için yazma izniniz.

Son olarak, tercihler örneğine sahip olduğunuzda , saklanan değerleri tercihlerden nasıl alabileceğiniz aşağıda açıklanmıştır :

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

To değerlerini saklamak tercih dosyası içinde SharedPreference.Editornesne kullanılmalıdır. sınıftaki Editoriç içe bir arabirimdir SharedPreference.

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

Editör ayrıca yöntemleri gibi destekler remove()ve clear()dosyadan tercih değerleri silmek.

Etkinlik Tercihleri:

Paylaşılan tercihler diğer uygulama bileşenleri tarafından kullanılabilir. Ancak, tercihleri ​​diğer bileşenlerle paylaşmanız gerekmiyorsa ve etkinlik özel tercihlerine sahip olmak istiyorsanız, bunu getPreferences()etkinlik yönteminin yardımıyla yapabilirsiniz . getPreferenceYöntem kullanan getSharedPreferences()tercih dosya adını etkinlik sınıfının adını yöntem.

Tercihleri ​​almak için kod aşağıdadır

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

Değerleri saklamak için kullanılan kod, paylaşılan tercihlerde olduğu gibi aynıdır.

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

Etkinlik durumunu veritabanında depolamak gibi diğer yöntemleri de kullanabilirsiniz. Not Android ayrıca adlı bir paket içerir android.preference. Paket, uygulama tercihleri ​​kullanıcı arayüzünü uygulamak için sınıfları tanımlar.

Daha fazla örnek görmek için geliştiricilerin sitesindeki Android'in Veri Depolama yayınına bakın.


55
+1: u günümü kurtardım .. İnternetteki öğreticilerin / örneklerin hiçbiri bunu söylemiyor tüm abt özellikleri ve özelleştirmeleri konuşurlar, ancak nasıl okunmazlar.
ankitjaininfo

1
Cevap güncellememi görün ve dosya adı şuna benziyor package.prefsama emin değilim.
Pentium10

1
Kod için teşekkürler. Beni karıştıran sadece küçük bir şey var: SharedPreference bir arabirimdir, bu yüzden herhangi bir yöntem çağrısını işleyen gerçek kod nerede uygulanır?
x1886x

1
Keşke bir hafta önce, gerçekten bilmediklerini bildikleri düşünen SE'de bazı aptal nerds cevapları / yorumları okurken zamanımı boşa harcamamış olsaydım .. Teşekkürler @ Pentium10, herhangi bir blogun var mı, tekrar teşekkürler, gerçekten takdir et :)
Sanjeevcn

1
Editor.commit () yerine, editor.apply () öğesini de kullanabilirsiniz. Fark, commit () öğesinin değişikliklerinizi eşzamanlı olarak yazması ve uygulamasının bunları eşzamansız olarak yazmasıdır. Bu kullanıcı arayüzünüzü hızlandırır.
Hashim Akhtar

29

Erişim izniniz yoksa getDefaultSharedPreferenes(), getSharedPreferences(name, mode)bunun yerine kullanabilirsiniz , sadece doğru adı girmeniz gerekir.

Android bu adı oluşturur (muhtemelen projenizin paket adına mı dayanmaktadır?). Aşağıdaki kodu a'ya koyarak SettingsActivity onCreate()ve ne preferencesNameolduğunu görerek alabilirsiniz .

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

Dize gibi bir şey olmalıdır com.example.projectname_preferences. Projenizde bir yere sabit kod koyun getSharedPreferences()ve içeri aktarın ve gitmek için iyi olmalısınız.


1
Etkinlik okumaları için kaynak: public SharedPreferences getPreferences (int mode) {return getSharedPreferences (getLocalClassName (), mode); }
Tatarize

22

Önce bu yöntemleri beyan edin ..

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);
}

Sonra bir pref koymak istediğinizde bunu arayın:

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

Bir pref almak istediğinizde bunu arayın:

getPref("myKey", getApplicationContext());

Veya her şeyi daha da basitleştiren https://github.com/kcochibili/TinyDB--Android-Shared-Preferences-Turbo bu nesneyi kullanabilirsiniz.

Misal:

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);

Neden editor.apply (); arka planda işlemek yerine
Avi Parshan

4

bağlamı her yerde geçirmek zorunda kalmak beni gerçekten sinirlendiriyor. kod çok ayrıntılı ve yönetilemez hale gelir. Bunu her projede yapıyorum ...

public class global {
    public static Activity globalContext = null;

ve ana etkinlik oluşturma

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

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

    global.globalContext = this;

ayrıca tüm tercih anahtarları dilden bağımsız olmalı, kimse bundan bahsetmediğinden şok oldum.

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

şimdi tek bir kod satırında bu şekilde

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

4
Anahtar dilini bağımsız hale getirmenin avantajı nedir? Asla kullanıcıya gösterilmez, değil mi?
Gerd

1
Lütfen, tanrı sevgisi için asla bir Etkinliği küresel bir Bağlam olarak kullanmayın. Genel bir Bağlam kullanmanız gerekiyorsa, lütfen bunu özel bir Uygulama sınıfı kullanarak yapın.
Thorben

1
@Torben Kabul etti. Veya sadecegetApplicationContext()
OneCricketeer

3

bir onay kutunuz varsa ve herhangi bir java dosyasında yani true / false değerini almak istiyorsanız--

Kullanmıyoruz--

Context mContext;
boolean checkFlag;

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

0

Güncelleme 2019

Sadece PowerPreferencekütüphaneyi kullanabilirsiniz

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

Paylaşımlı tercih örneğini alma

Varsayılan örneği almak için aramanız yeterlidir

PowerPreference.getDefaultFile()

Veya belirli bir tercih dosyası istiyorsanız

PowerPreference.getFileByName(fileName)

Veri Yazma:

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

Veri Alma

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

PowerPreference bağlam bölümünü nasıl işler? Paylaşılan tercihleri ​​okumak için bir bağlam gerekiyor, değil mi? Android'de yeniyim ve anlamaya çalışıyorum.
Yeti

0

Benim için çalışan kaynak kodunu takip etmeyi deneyin

//Fetching id from shared preferences
    SharedPreferences sharedPreferences;
    sharedPreferences =getSharedPreferences(Constant.SHARED_PREF_NAME, Context.MODE_PRIVATE);
    getUserLogin = sharedPreferences.getString(Constant.ID_SHARED_PREF, "");
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.