Android Tercihleri: Kullanıcı tercihler ekranını kullanmadığında varsayılan değerler nasıl yüklenir?


119

Kullanıcının bazı değerleri ayarlamasına izin vermek için bir PreferenceActivity kullanıyorum. Tanımlanmış tercihlerle xml dosyasıyla besliyorum.

Hepsini android:defaultValue=""onlar için ayarladım .

Uygulamamı başlattığımda, tercihlere ihtiyacım var veya bunlar henüz manuel olarak ayarlanmadıysa, varsayılan değerleri istiyorum:

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
boolean value = prefs.getBoolean("key"), false); 

Ancak, android:defaultValue="true"hala aldığımda false. Bu nedenle, XML'de ayarlanan defaultValues ​​herhangi bir yerde değil, tercihler ekranını başlatırken kullanılır gibi görünüyor.

getBoolean()Yöntemdeki varsayılan değerleri sabit kodlamak istemiyorum . Öyleyse, bunları yalnızca 1 yerde tanımlayarak varsayılan değerleri almanın bir yolu var mı?

Yanıtlar:


170

bu soru benimkine benzer:

initialize-tercihler-den-xml-in-ana-aktivite

Sadece bu kodu onCreateyöntemde kullanın :

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

Tercihlerinizi XML'den yükleyecek ve son parametre ( readAgain) kullanıcı tercihlerinin üzerine yazılmayacağını garanti edecektir. Bu, readAgainbağımsız değişkeni olarak falseayarlamak, bunun yalnızca bu yöntem geçmişte hiç çağrılmadıysa varsayılan değerleri belirleyeceği anlamına gelir, böylece Etkinliğiniz her oluşturulduğunda kullanıcı ayarlarını geçersiz kılma konusunda endişelenmenize gerek yoktur.

Daha fazla araştırma için Android API'de PreferenceManager.setDefaultValues'e bir göz atın .


Bunu oluşturduğumuz başka bir SharedPrefrence değişkeni üzerinde kullanabilir miyiz?
Amol Gupta

9
App çoklu giriş noktalarını varsa Ayrıca, yerleştirin onCreate()arasında Application.
SD

2
Bu, bir boole kullanılıyorsa ve varsayılan olarak "false" olarak ayarlandığında çalışmaz, çünkü o zaman varsayılan giriş Android 2.x'te oluşturulmayacaktır. ".GetBoolean (KEY, true)" çağrısı her zaman true değerini döndürür. Android 4.x için çalışır.
Gunnar Bernstein

10
readAgainTrue olarak ayarlamanın , kullanıcı tercihlerinin üzerine yazılmasıyla hiçbir ilgisi yoktur. Javadoc'tan: Not: Bu, tercihleri ​​varsayılan değerlerine sıfırlamaz.
devconsole

1
Bu çözümle ilgili sorunları olanlar için (ya kısmen çalışmıyor ya da her zaman çalışmıyor) aşağıdaki Steve Waring'in cevabına bakın ( stackoverflow.com/a/25602205/4410376 ). Büyük olasılıkla birkaç paylaşılan tercih dosyanız vardır, yani android, yapılandırmanıza veya karışık kodunuza bağlı olarak birkaç paylaşılan tercih dosyası oluşturuyor.
Hack06

27

Kullanıyorsanız farkında olun
getSharedPreferences(String sharedPreferencesName, int sharedPreferencesMode)

tercihleri ​​almak için varsayılanları ayarlamak için kullanmanız gerekir!
PreferenceManager.setDefaultValues(Context context, String sharedPreferencesName, int sharedPreferencesMode, int resId, boolean readAgain)

Örneğin:
PreferenceManager.setDefaultValues(this, PREFS_NAME, Context.MODE_PRIVATE, R.xml.preference, false);

Umarım bu birine yardımcı olabilir.


13

Pixel'in kabul ettiği yanıtta:

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

o belirtilmektedir falsevarsayılan üzerine yazılır olmayacağını vasıtası. Yaptığı şey bu değil, uygulamanızın birden fazla giriş noktası varsa, ayrıştırmayı durdurmak için sadece bir verimlilik bayrağıdır. Maalesef test, tercih dosyası başına yapılmaz, bu nedenle birden fazla tercih dosyanız varsa true, ilki hariç tümünde kodlamalısınız.

Verimlilik konusunda endişeliyseniz, bunun gibi bir şey kodlayabilirsiniz.

final static private int SPL = 1;
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
if (sp.getInt("spl", 0) != SPL)
{
    PreferenceManager.setDefaultValues(this, R.xml.prefs1, true);
    PreferenceManager.setDefaultValues(this, R.xml.prefs2, true);
    sp.edit().putInt("spl", SPL).apply();
}

Daha fazla paylaşılan tercih eklerseniz, SPL'yi yüksek bir sayıya ayarlamanız yeterlidir.


2
Alternatif olarak, YALNIZCA varsayılan değerleri ayarlamak için kullandığınız bir toplu tercihler.xml dosyasını her zaman oluşturabilirsiniz. Örneğin, varsa R.xml.prefs_device, R.xml.prefs_testve R.xml.prefs_admin. Yukardan gelen prefs tümünü içeren bir prefs dosyası oluşturabilirsiniz: R.xml.prefs_for_loading_default_values. Sonra bunu kullanın PreferenceManager.setDefaultValues(this, R.xml.prefs_for_loading_default_values, false);
Chantell Osejo

Verimlilik ile ilgili olarak: eğer bunu onCreate()bir alt sınıfından Application(manifestte kayıtlı) olarak adlandırırsanız, her durumda uygulama başlangıcında yalnızca bir kez çağrılacaktır. Performans için, uygulama her başladığında ayrıştırmayı yapmamak (eğer varsa) daha alakalı olacaktır (bunun yerine yalnızca ilk başlangıcında) ve ne işe yarar false. Bu nedenle, daha çok her başlangıçta bir kontrole ihtiyacınız olup olmadığı (örneğin yeni tercihler eklenebilirse) veya ilk başlangıçta yapıldığında (veya tercihler sıfırlandığında) yeterli olup olmadığı sorusudur.
user905686

2

Örneğin genişletme DialogPreferencebunu yapıyorum:

@Override
protected void onSetInitialValue(boolean restore, Object defaultValue) {
    super.onSetInitialValue(restore, defaultValue);

    if (restore) {
        mValue = shouldPersist() ? getPersistedString(mDefault) : mDefault;
    } else {
        mValue = mDefault;
    }
}

mDefault şunlar olabilir:

  • mContext.getResources (). getString (attrs.getAttributeResourceValue (androidns, "defaultValue", 100));
  • R'de indekslediğiniz bir şey.

Tamam, başarmaya çalıştığınız şey konusunda biraz kayboldum. DialogPreference'ı aramak istemiyorum, kullanıcı Tercihleri ​​kullanmadığında varsayılan değere ihtiyacım var.
Peterdk

Prefs.xml dosyanızda varsayılan Tercihleri ​​kullanmak yerine kendi sınıflarınızı oluşturabilirsiniz. Örneğin, DialogPreference'den genişleyen yeni bir DialogPreference oluşturabilir ve onSetInitialValue değerini geçersiz kılabilirsiniz.
Macarse

0

Ayrıca daha önce SharedPreferences'ı hiç kullanmadığınızdan emin olun. Değiştirilmediklerinden emin olmak için (yani setDefaultValues'in (this, xml, false) etkisi yoktur) Uygulamanızı kaldırın ve hiçbir değere dokunulmadığından emin olmak için tekrar yükleyin. Bu bana yardımcı oldu.

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.