ฉันจะรับ SharedPreferences จาก PreferenceActivity ใน Android ได้อย่างไร


373

ฉันใช้ PreferenceActivity เพื่อแสดงการตั้งค่าบางอย่างสำหรับแอปพลิเคชันของฉัน ฉันพองการตั้งค่าผ่านไฟล์ xml เพื่อให้ onCreate ของฉัน (และวิธีการเรียนแบบสมบูรณ์) มีลักษณะดังนี้:

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

javadoc ของPreferenceActivity PreferenceFragmentระบุว่า

ค่ากำหนดเหล่านี้จะบันทึกลงใน SharedPreferences โดยอัตโนมัติเมื่อผู้ใช้โต้ตอบกับพวกเขา เมื่อต้องการดึงอินสแตนซ์ของ SharedPreferences ที่ลำดับชั้นการกำหนดค่าตามความชอบในกิจกรรมนี้จะใช้ให้เรียกใช้ getDefaultSharedPreferences (android.content.Context) พร้อมบริบทในแพ็คเกจเดียวกันกับกิจกรรมนี้

แต่ฉันจะรับชื่อ SharedPreference ในกิจกรรมอื่นได้อย่างไร ฉันโทรได้เท่านั้น

getSharedPreferences(name, mode)

ในกิจกรรมอื่น แต่ฉันต้องการชื่อของ SharedPreference ที่ใช้โดย PreferenceActivity ชื่อหรือฉันจะเรียกคืนได้อย่างไร

คำตอบ:


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

ปรับปรุง

ตามการตั้งค่าที่ใช้ร่วมกัน | บทแนะนำผู้พัฒนา Android (ตอนที่ 13)โดย Sai Geetha MN,

แอปพลิเคชันจำนวนมากอาจมีวิธีในการจับภาพการตั้งค่าของผู้ใช้ในการตั้งค่าของแอปพลิเคชันเฉพาะหรือกิจกรรม เพื่อรองรับสิ่งนี้ Android ได้จัดทำ API แบบง่าย ๆ

การตั้งค่าโดยทั่วไปจะเป็นคู่ของชื่อค่า พวกเขาสามารถเก็บไว้เป็น "การตั้งค่าที่ใช้ร่วมกัน" ในกิจกรรมต่าง ๆ ในแอปพลิเคชัน (หมายเหตุปัจจุบันไม่สามารถแชร์ข้ามกระบวนการ) หรืออาจเป็นสิ่งที่ต้องจัดเก็บเฉพาะกิจกรรม

  1. การตั้งค่าที่ใช้ร่วมกัน: การกำหนดลักษณะที่ใช้ร่วมกันสามารถใช้งานได้โดยองค์ประกอบทั้งหมด (กิจกรรมบริการและอื่น ๆ ) ของแอปพลิเคชัน

  2. การกำหนดค่าตามความชอบของกิจกรรม: การกำหนดค่าตามความชอบเหล่านี้สามารถใช้ได้ภายในกิจกรรมเฉพาะเท่านั้นและไม่สามารถใช้โดยส่วนประกอบอื่นของแอปพลิเคชัน

การตั้งค่าที่ใช้ร่วมกัน:

การตั้งค่าที่ใช้ร่วมกันได้รับการจัดการด้วยความช่วยเหลือของgetSharedPreferencesวิธีการContextเรียน การตั้งค่าจะถูกเก็บไว้ในไฟล์เริ่มต้น(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เป็นโหมดการทำงานสำหรับการตั้งค่า เป็นโหมดเริ่มต้นและหมายความว่าไฟล์ที่สร้างจะสามารถเข้าถึงได้โดยแอปพลิเคชันที่เรียกเท่านั้น อื่น ๆ สองโหมดการสนับสนุนและ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();

Editor ยังรองรับเมธอดเช่น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: คุณบันทึกวันของฉันแล้วไม่มีบทเรียน / ตัวอย่างบนอินเทอร์เน็ตที่บอกเกี่ยวกับสิ่งนี้ ทั้งหมดที่พวกเขาพูดถึงคุณสมบัติของ abt และการปรับแต่ง แต่ไม่ใช่วิธีการอ่าน
ankitjaininfo

1
ดูการปรับปรุงคำตอบของฉันและชื่อไฟล์เป็นสิ่งที่ชอบpackage.prefsแต่ฉันไม่แน่ใจ
Pentium10

1
ขอบคุณสำหรับรหัส มีเพียงสิ่งเล็กน้อยที่ทำให้ฉันสับสน: SharedPreference เป็นอินเทอร์เฟซดังนั้นรหัสจริงที่นำไปใช้ซึ่งจัดการกับการเรียกเมธอดใด ๆ
x1886x

1
หวังว่าฉันจะได้อ่านสัปดาห์นี้ก่อนที่จะเสียเวลาอ่านคำตอบ / ความคิดเห็นโง่ ๆ ทั่ว SE ใครคิดว่าพวกเขารู้เมื่อพวกเขาไม่ได้จริง ๆ ขอบคุณ @ Pentium10 คุณเป็นเจ้าของบล็อกขอบคุณอีกครั้งขอบคุณจริงๆ :)
Sanjeevcn

1
แทนที่จะใช้ editor.commit () คุณสามารถใช้ editor.apply () ข้อแตกต่างคือคอมมิชชัน () เขียนการเปลี่ยนแปลงของคุณแบบซิงโครนัสและใช้การเขียนแบบอะซิงโครนัส นี่ทำให้ UI ของคุณเร็วขึ้น
Hashim Akhtar

29

หากคุณไม่สามารถเข้าถึงgetDefaultSharedPreferenes()คุณสามารถใช้getSharedPreferences(name, mode)แทนคุณเพียงแค่ต้องส่งในชื่อที่ถูกต้อง

Android สร้างชื่อนี้ (อาจเป็นไปตามชื่อแพ็คเกจของโครงการของคุณหรือไม่) คุณสามารถรับมันได้โดยใส่รหัสต่อไปนี้ในSettingsActivity onCreate()และดูว่าpreferencesNameมีอะไร

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

com.example.projectname_preferencesสตริงควรจะเป็นสิ่งที่ชอบ รหัสยากที่อยู่ในโครงการของคุณและส่งผ่านไปgetSharedPreferences()และคุณควรจะไป


1
แหล่งที่มาสำหรับการอ่านกิจกรรม: public SharedPreferences getPreferences (โหมด int) {return getSharedPreferences (getLocalClassName (), โหมด); }
Tatarize

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

เรียกสิ่งนี้เมื่อคุณต้องการรับ pref:

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

ต้องผ่านบริบทรอบ ๆ ทุกที่เป็นที่น่ารำคาญจริงๆฉัน รหัสกลายเป็น verbose เกินไปและไม่สามารถจัดการได้ ฉันทำสิ่งนี้ในทุกโครงการแทน ...

public class global {
    public static Activity globalContext = null;

และตั้งค่าในกิจกรรมหลักที่สร้าง

@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()

ตอนนี้เรียกมันว่าอย่างนี้ในรหัสบรรทัดเดียว

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

4
อะไรคือข้อดีของการทำให้ภาษาของคีย์เป็นอิสระ? พวกเขาจะไม่ปรากฏแก่ผู้ใช้ใช่ไหม
Gerd

1
กรุณาเพื่อความรักของพระเจ้าอย่าใช้กิจกรรมเป็นบริบททั่วโลก หากคุณต้องใช้บริบทส่วนกลางกรุณาทำโดยใช้คลาสแอปพลิเคชันที่กำหนดเอง
Thorben

1
@Thorben เห็นด้วย หรือเพียงแค่getApplicationContext()
OneCricketeer

3

หากคุณมีช่องทำเครื่องหมายและคุณต้องการที่จะดึงมันเป็นค่าเช่นจริง / เท็จในไฟล์ java ใด ๆ -

ใช้--

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 และพยายามเข้าใจ
Yeti

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.