การตั้งค่า เป็นส่วนหนึ่งของ Android Jetpack
การตั้งค่าช่วยให้ผู้ใช้เปลี่ยนฟังก์ชันและลักษณะการทำงานของแอปได้ การตั้งค่าสามารถ ส่งผลต่อลักษณะการทำงานในเบื้องหลัง เช่น ความถี่ที่แอปซิงค์ข้อมูลกับ ระบบคลาวด์ หรือเข้าถึงผู้ชมได้กว้างขึ้น เช่น เปลี่ยนเนื้อหาและ จากอินเทอร์เฟซผู้ใช้
ในการผสานรวมการตั้งค่าที่ผู้ใช้กำหนดค่าได้ลงในแอปของคุณ ให้ใช้ AndroidX ไลบรารีค่ากำหนด ไลบรารีนี้จัดการอินเทอร์เฟซผู้ใช้และโต้ตอบกับ เพื่อให้คุณกำหนดเฉพาะการตั้งค่าแต่ละรายการที่ผู้ใช้สามารถ กำหนดค่า ไลบรารีนี้มาพร้อมกับธีมดีไซน์ Material ที่ให้ ผู้ใช้ได้รับประสบการณ์ที่สอดคล้องกันทั้งในอุปกรณ์และระบบปฏิบัติการเวอร์ชันต่างๆ
เริ่มต้นใช้งาน
Preference
คืออาคารพื้นฐาน
ของไลบรารีค่ากำหนด หน้าจอการตั้งค่ามีPreference
ลำดับชั้น คุณสามารถกำหนดลำดับชั้นนี้เป็นทรัพยากร XML หรือคุณสามารถสร้าง
ลำดับชั้นในโค้ด
ส่วนต่อไปนี้จะอธิบายวิธีสร้างหน้าจอการตั้งค่าอย่างง่ายโดยใช้ ไลบรารีค่ากำหนด AndroidX
ก่อนเริ่มต้น ให้เพิ่มทรัพยากร Dependency ของไลบรารีค่ากำหนดลงใน build.gradle
ไฟล์:
ดึงดูด
dependencies { implementation "androidx.preference:preference-ktx:1.2.0" }
Kotlin
dependencies { implementation("androidx.preference:preference-ktx:1.2.0") }
หลังจากซิงค์ Gradle แล้ว คุณสามารถไปยังส่วน XML ของงานได้
สร้างลำดับชั้น
ในโปรเจ็กต์ ให้ไปที่โฟลเดอร์ res/xml
สร้างไฟล์ preferences.xml
และเพิ่มโค้ดต่อไปนี้ลงในไฟล์
<PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto"> <SwitchPreferenceCompat app:key="notifications" app:title="Enable message notifications"/> <Preference app:key="feedback" app:title="Send feedback" app:summary="Report technical issues or suggest new features"/> </PreferenceScreen>
ลำดับชั้นนี้ประกอบด้วยออบเจ็กต์ Preference
2 รายการ ได้แก่
SwitchPreferenceCompat
ที่ช่วยให้ผู้ใช้เปิดหรือปิดการตั้งค่าได้ รวมถึงPreference
พื้นฐานที่ไม่มี
วิดเจ็ต
เมื่อสร้างลำดับชั้น Preference
แต่ละรายการต้องมีคีย์ที่ไม่ซ้ำกัน
เพิ่มลำดับชั้น
หากต้องการเพิ่มลำดับชั้นจากแอตทริบิวต์ XML ให้สร้าง
PreferenceFragmentCompat
ลบล้าง
onCreatePreferences()
,
และระบุทรัพยากร XML เพื่อทำให้สูงเกินจริง ดังที่ปรากฏในตัวอย่างต่อไปนี้:
Kotlin
class MySettingsFragment : PreferenceFragmentCompat() { override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.preferences, rootKey) } }
Java
public class MySettingsFragment extends PreferenceFragmentCompat { @Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { setPreferencesFromResource(R.xml.preferences, rootKey); } }
จากนั้นคุณสามารถเพิ่ม Fragment
นี้ลงใน Activity
ของคุณได้เช่นเดียวกับที่ใช้เพิ่ม
Fragment
:
Kotlin
class MySettingsActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) supportFragmentManager .beginTransaction() .replace(R.id.settings_container, MySettingsFragment()) .commit() } }
Java
public class MySettingsActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getSupportFragmentManager() .beginTransaction() .replace(R.id.settings_container, new MySettingsFragment()) .commit(); } }
ผลลัพธ์จะแสดงในรูปภาพต่อไปนี้
ตรวจสอบค่ากำหนด
คุณสามารถรับเหตุการณ์เมื่อค่ากำหนดเปลี่ยนแปลงโดยการลงทะเบียน Listener สำหรับ ดังนี้
Kotlin
findPreference<SwitchPreferenceCompat>("notifications") ?.setOnPreferenceChangeListener { _, newValue -> Log.d("Preferences", "Notifications enabled: $newValue") true // Return true if the event is handled. } findPreference<Preference>("feedback") ?.setOnPreferenceClickListener { Log.d("Preferences", "Feedback was clicked") true // Return true if the click is handled. }
Java
SwitchPreferenceCompat notificationsPref = findPreference("notifications"); if (notificationsPref != null) { notificationsPref.setOnPreferenceChangeListener((preference, newValue) -> { Log.d("Preferences", String.format("Notifications enabled: %s", newValue)); return true; // Return true if the event is handled. }); } Preference feedbackPref = findPreference("feedback"); if (feedbackPref != null) { feedbackPref.setOnPreferenceClickListener((preference) -> { Log.d("Preferences", "Feedback was clicked"); return true; // Return true if the event is handled. }); }
อ่านค่าค่ากำหนดปัจจุบัน
PreferenceFragmentCompat
ซ่อนเครื่องจักรส่วนใหญ่ที่เกี่ยวข้องกับการบันทึกและ
การอ่านค่ากำหนด อย่างไรก็ตาม ทุกอย่างจะได้รับการจัดเก็บไว้โดยใช้
SharedPreferences
และคุณสามารถอ่านค่าเหล่านี้ได้ตามปกติกับ
SharedPreferences
:
Kotlin
val preferences = PreferenceManager.getDefaultSharedPreferences(this).all preferences.forEach { Log.d("Preferences", "${it.key} -> ${it.value}") }
Java
var preferences = PreferenceManager.getDefaultSharedPreferences(context).getAll(); preferences.forEach((key, value) ->{ Log.d("Preferences", String.format("%s -> %s", key, value)); });
ข้อมูลโค้ดก่อนหน้าได้รับอินสแตนซ์ของ SharedPreferences
เริ่มต้นสำหรับ
เข้าถึงค่าที่จัดเก็บไว้ทั้งหมด วนซ้ำ และพิมพ์ค่าใน
Logcat