การตั้งค่า ส่วนหนึ่งของ Android Jetpack
การตั้งค่าช่วยให้ผู้ใช้เปลี่ยนฟังก์ชันและลักษณะการทำงานของแอปได้ การตั้งค่าอาจส่งผลต่อลักษณะการทำงานในเบื้องหลัง เช่น ความถี่ที่แอปซิงค์ข้อมูลกับระบบคลาวด์ หรืออาจเข้าถึงข้อมูลที่กว้างขึ้น เช่น เปลี่ยนเนื้อหาและการนำเสนออินเทอร์เฟซผู้ใช้
หากต้องการผสานรวมการตั้งค่าที่ผู้ใช้กำหนดค่าได้ไว้ในแอป ให้ใช้ไลบรารี AndroidX Preference ไลบรารีนี้จะจัดการอินเทอร์เฟซผู้ใช้และโต้ตอบกับพื้นที่เก็บข้อมูลเพื่อให้คุณกำหนดเฉพาะการตั้งค่าแต่ละรายการที่ผู้ใช้สามารถกําหนดค่าได้ คลังมาพร้อมกับธีม Material Design ที่ให้ประสบการณ์การใช้งานที่สอดคล้องกันในทุกอุปกรณ์และเวอร์ชันระบบปฏิบัติการ
เริ่มต้นใช้งาน
Preference
คือบล็อกการสร้างพื้นฐานของไลบรารีค่ากำหนด หน้าจอการตั้งค่าจะมีลําดับชั้น Preference
คุณสามารถกําหนดลําดับชั้นนี้เป็นทรัพยากร XML หรือสร้างลําดับชั้นในโค้ดก็ได้
ส่วนต่อไปนี้จะอธิบายวิธีสร้างหน้าจอการตั้งค่าแบบง่ายโดยใช้ไลบรารี AndroidX Preference
ก่อนที่คุณจะเริ่มต้น ให้เพิ่มทรัพยากร Dependency ของไลบรารีค่ากำหนดลงในไฟล์ build.gradle
ดังนี้
dependencies {
implementation "androidx.preference:preference-ktx:1.2.0"
}
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 เพื่อขยาย ดังที่แสดงในตัวอย่างต่อไปนี้
class MySettingsFragment : PreferenceFragmentCompat() {
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
setPreferencesFromResource(R.xml.preferences, rootKey)
}
}
public class MySettingsFragment extends PreferenceFragmentCompat {
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
setPreferencesFromResource(R.xml.preferences, rootKey);
}
}
จากนั้นคุณสามารถเพิ่ม Fragment
นี้ลงใน Activity
ของคุณได้เช่นเดียวกับ Fragment
อื่นๆ ดังนี้
class MySettingsActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
supportFragmentManager
.beginTransaction()
.replace(R.id.settings_container, MySettingsFragment())
.commit()
}
}
public class MySettingsActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.settings_container, new MySettingsFragment())
.commit();
}
}
ผลลัพธ์จะแสดงในรูปภาพต่อไปนี้

Preference
2 รายการ
ตรวจสอบค่ากําหนด
คุณสามารถรับเหตุการณ์เมื่อค่ากําหนดมีการเปลี่ยนแปลงโดยการลงทะเบียน Listener ดังนี้
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.
}
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
โดยทั่วไป
val preferences = PreferenceManager.getDefaultSharedPreferences(this).all
preferences.forEach {
Log.d("Preferences", "${it.key} -> ${it.value}")
}
var preferences = PreferenceManager.getDefaultSharedPreferences(context).getAll();
preferences.forEach((key, value) ->{
Log.d("Preferences", String.format("%s -> %s", key, value));
});
ข้อมูลโค้ดก่อนหน้าจะรับอินสแตนซ์ของ SharedPreferences
เริ่มต้นสําหรับแอป เข้าถึงค่าที่เก็บไว้ทั้งหมด ทำซ้ำค่าเหล่านั้น และพิมพ์ไว้ใน Logcat