การตั้งค่า ส่วนหนึ่งของ Android Jetpack
การตั้งค่าช่วยให้ผู้ใช้เปลี่ยนฟังก์ชันและลักษณะการทำงานของแอปได้ การตั้งค่าอาจส่งผลต่อลักษณะการทำงานในเบื้องหลัง เช่น ความถี่ที่แอปซิงค์ข้อมูลกับระบบคลาวด์ หรืออาจเข้าถึงข้อมูลที่กว้างขึ้น เช่น เปลี่ยนเนื้อหาและการนำเสนออินเทอร์เฟซผู้ใช้
หากต้องการผสานรวมการตั้งค่าที่ผู้ใช้กำหนดค่าได้ไว้ในแอป ให้ใช้ไลบรารี AndroidX Preference ไลบรารีนี้จะจัดการอินเทอร์เฟซผู้ใช้และโต้ตอบกับพื้นที่เก็บข้อมูลเพื่อให้คุณกำหนดเฉพาะการตั้งค่าแต่ละรายการที่ผู้ใช้สามารถกําหนดค่าได้ คลังมาพร้อมกับธีม Material Design ที่ให้ประสบการณ์การใช้งานที่สอดคล้องกันในทุกอุปกรณ์และเวอร์ชันระบบปฏิบัติการ
เริ่มต้นใช้งาน
Preference
คือบล็อกการสร้างพื้นฐานของไลบรารีค่ากำหนด หน้าจอการตั้งค่าจะมีลําดับชั้น Preference
คุณสามารถกําหนดลําดับชั้นนี้เป็นทรัพยากร XML หรือสร้างลําดับชั้นในโค้ดก็ได้
ส่วนต่อไปนี้จะอธิบายวิธีสร้างหน้าจอการตั้งค่าแบบง่ายโดยใช้ไลบรารี AndroidX Preference
ก่อนที่คุณจะเริ่มต้น ให้เพิ่มทรัพยากร Dependency ของไลบรารีค่ากำหนดลงในไฟล์ build.gradle
ดังนี้
Groovy
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