การตั้งค่า Android: จะโหลดค่าเริ่มต้นได้อย่างไรเมื่อผู้ใช้ไม่ได้ใช้หน้าจอการตั้งค่า


119

ฉันใช้ PreferenceActivity เพื่อให้ผู้ใช้กำหนดค่าบางอย่าง ฉันกำลังป้อนไฟล์ xml ด้วยค่ากำหนดที่กำหนด

ฉันได้ตั้งค่าทั้งหมดandroid:defaultValue=""สำหรับพวกเขาแล้ว

เมื่อฉันเริ่มแอปพลิเคชันฉันต้องการค่ากำหนดหรือหากยังไม่ได้ตั้งค่าด้วยตนเองฉันต้องการค่าเริ่มต้น:

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

แต่เมื่อฉันยังคงได้รับandroid:defaultValue="true" falseดังนั้นดูเหมือนว่าค่า defaultValues ​​ที่ตั้งไว้ใน XML จะไม่ถูกใช้ที่ใดก็ได้ แต่เมื่อเริ่มต้นหน้าจอการตั้งค่า

ฉันไม่ต้องการฮาร์ดโค้ดค่าเริ่มต้นในgetBoolean()เมธอด มีวิธีรับค่าเริ่มต้นโดยกำหนดค่าเหล่านี้ในที่เดียวเท่านั้นหรือไม่?

คำตอบ:


170

คำถามนี้คล้ายกับของฉัน:

การเริ่มต้นการตั้งค่า-จากที่ XML ในหลักกิจกรรม

เพียงใช้รหัสนี้ในonCreateวิธีการ:

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

จะโหลดค่ากำหนดของคุณจาก XML และพารามิเตอร์สุดท้าย ( readAgain) จะรับประกันว่าค่ากำหนดของผู้ใช้จะไม่ถูกเขียนทับ นั่นหมายถึงการตั้งค่าreadAgainอาร์กิวเมนต์เป็นfalseหมายความว่าสิ่งนี้จะตั้งค่าเริ่มต้นก็ต่อเมื่อวิธีนี้ไม่เคยถูกเรียกมาก่อนดังนั้นคุณไม่จำเป็นต้องกังวลเกี่ยวกับการลบล้างการตั้งค่าของผู้ใช้ทุกครั้งที่สร้างกิจกรรมของคุณ

ตรวจสอบPreferenceManager.setDefaultValuesใน Android API เพื่อตรวจสอบเพิ่มเติม


เราสามารถใช้สิ่งนี้กับตัวแปร SharedPrefrence อื่นที่เราสร้างขึ้นได้หรือไม่
Amol Gupta

9
นอกจากนี้หากแอปของคุณมีคะแนนหลายรายการที่วางไว้ในของonCreate() Application
SD

2
สิ่งนี้ใช้ไม่ได้หากใช้บูลีนและตั้งค่าเริ่มต้นเป็น "เท็จ" เนื่องจากรายการเริ่มต้นจะไม่ถูกสร้างขึ้นใน Android 2.x การเรียก ".getBoolean (KEY, true)" จะคืนค่าจริงเสมอ สำหรับ Android 4.x ใช้งานได้
Gunnar Bernstein

10
การตั้งค่าreadAgainเป็น true ไม่มีส่วนเกี่ยวข้องกับการตั้งค่าของผู้ใช้ที่ถูกเขียนทับ จาก Javadoc: หมายเหตุ: สิ่งนี้จะไม่รีเซ็ตการตั้งค่ากลับเป็นค่าเริ่มต้น
devconsole

1
สำหรับผู้ที่มีปัญหากับโซลูชันนี้ (ไม่ได้ผลหรือใช้งานได้บางส่วนหรือไม่เสมอไป) ดูคำตอบของ Steve Waring ด้านล่าง ( stackoverflow.com/a/25602205/4410376 ) เป็นไปได้มากว่าคุณมีไฟล์ prefs ที่ใช้ร่วมกันหลายไฟล์กล่าวคือ android กำลังสร้างไฟล์ prefs ที่ใช้ร่วมกันหลายไฟล์ตามการกำหนดค่าหรือโค้ดที่ยุ่งเหยิงของคุณ
Hack06

27

โปรดทราบว่าหากคุณใช้
getSharedPreferences(String sharedPreferencesName, int sharedPreferencesMode)

เพื่อดึงค่ากำหนดที่คุณต้องใช้ เพื่อตั้งค่าเริ่มต้น!
PreferenceManager.setDefaultValues(Context context, String sharedPreferencesName, int sharedPreferencesMode, int resId, boolean readAgain)

ตัวอย่างเช่น:
PreferenceManager.setDefaultValues(this, PREFS_NAME, Context.MODE_PRIVATE, R.xml.preference, false);

ฉันหวังว่านี่จะช่วยใครสักคนได้


13

ในคำตอบที่ยอมรับของ Pixel:

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

มีการระบุfalseว่าค่าเริ่มต้นจะไม่ถูกเขียนทับ นี่ไม่ใช่สิ่งที่ทำ แต่เป็นเพียงค่าสถานะประสิทธิภาพในการหยุดการแยกวิเคราะห์หากแอปพลิเคชันของคุณมีจุดเข้าใช้งานมากกว่าหนึ่งจุด น่าเสียดายที่การทดสอบไม่ได้ทำต่อไฟล์ความชอบดังนั้นหากคุณมีไฟล์การตั้งค่ามากกว่าหนึ่งไฟล์คุณต้องเขียนโค้ดtrueในไฟล์ทั้งหมดยกเว้นไฟล์แรก

หากคุณกังวลเกี่ยวกับประสิทธิภาพคุณสามารถเขียนโค้ดแบบนี้ได้

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

หากคุณเคยเพิ่มค่ากำหนดที่ใช้ร่วมกันมากขึ้นเพียงแค่ตั้งค่า SPL เป็นจำนวนที่สูง


2
อีกทางเลือกหนึ่งคือคุณสามารถสร้างค่ากำหนดจำนวนมากที่คุณใช้สำหรับการตั้งค่าเริ่มต้นเท่านั้น ตัวอย่างเช่นถ้าคุณมี R.xml.prefs_device, และR.xml.prefs_test คุณสามารถสร้างแฟ้มการตั้งค่าของคนที่มีทั้งหมดของการตั้งค่าจากด้านบน:R.xml.prefs_admin R.xml.prefs_for_loading_default_valuesจากนั้นใช้กับ PreferenceManager.setDefaultValues(this, R.xml.prefs_for_loading_default_values, false);
Chantell Osejo

เกี่ยวกับประสิทธิภาพ: หากคุณเรียกสิ่งนี้ในonCreate()คลาสย่อยของApplication(ลงทะเบียนในรายการ) ระบบจะเรียกเพียงครั้งเดียวต่อการเริ่มแอปพลิเคชัน เพื่อประสิทธิภาพจะมีความเกี่ยวข้องมากขึ้น (ถ้าเป็นเช่นนั้น) ที่จะไม่ทำการแยกวิเคราะห์ทุกครั้งที่แอปเริ่มทำงาน (แทนที่จะเป็นเพียงการเริ่มต้นครั้งแรก) และนี่คือสิ่งที่falseทำ ดังนั้นจึงเป็นคำถามมากกว่าว่าคุณต้องการตรวจสอบในการเริ่มต้นแต่ละครั้ง (เช่นเมื่ออาจเพิ่มค่ากำหนดใหม่) หรือว่าเพียงพอหรือไม่หากเสร็จสิ้นในการเริ่มต้นครั้งแรก (หรือรีเซ็ตค่ากำหนด)
user905686

2

ตัวอย่างเช่นการขยายDialogPreferenceฉันทำสิ่งนี้:

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

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

mDefault สามารถ:

  • mContext.getResources (). getString (attrs.getAttributeResourceValue (androidns, "defaultValue", 100));
  • สิ่งที่คุณทำดัชนีใน R

โอเคฉันหลงทางนิดหน่อยเกี่ยวกับสิ่งที่คุณพยายามจะบรรลุ ฉันไม่ต้องการเรียก DialogPreference ฉันต้องการค่าเริ่มต้นเมื่อผู้ใช้ไม่ได้ใช้ค่ากำหนด
Peterdk

แทนที่จะใช้ค่ากำหนดเริ่มต้นใน prefs.xml ของคุณคุณสามารถสร้างคลาสของคุณเองได้ ตัวอย่างเช่นคุณสามารถสร้าง DialogPreference ใหม่ที่ขยายจาก DialogPreference และแทนที่ onSetInitialValue
Macarse

0

ตรวจสอบให้แน่ใจว่าคุณไม่เคยใช้ SharedPreferences มาก่อน เพื่อให้แน่ใจว่าไม่มีการเปลี่ยนแปลง (ซึ่งหมายความว่า setDefaultValues ​​(นี่คือ xml, false) ไม่มีผลใด ๆ ) ให้ถอนการติดตั้งแอพของคุณและอัปโหลดอีกครั้งเพื่อให้แน่ใจว่าไม่มีการแตะค่าใด ๆ สิ่งนี้ช่วยฉันได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.