การตั้งค่า ส่วนหนึ่งของ Android Jetpack

การตั้งค่าช่วยให้ผู้ใช้เปลี่ยนฟังก์ชันและลักษณะการทำงานของแอปได้ การตั้งค่าอาจส่งผลต่อลักษณะการทำงานในเบื้องหลัง เช่น ความถี่ที่แอปซิงค์ข้อมูลกับระบบคลาวด์ หรืออาจเข้าถึงข้อมูลที่กว้างขึ้น เช่น เปลี่ยนเนื้อหาและการนำเสนออินเทอร์เฟซผู้ใช้

หากต้องการผสานรวมการตั้งค่าที่ผู้ใช้กำหนดค่าได้ไว้ในแอป ให้ใช้ไลบรารี AndroidX Preference ไลบรารีนี้จะจัดการอินเทอร์เฟซผู้ใช้และโต้ตอบกับพื้นที่เก็บข้อมูลเพื่อให้คุณกำหนดเฉพาะการตั้งค่าแต่ละรายการที่ผู้ใช้สามารถกําหนดค่าได้ คลังมาพร้อมกับธีม Material Design ที่ให้ประสบการณ์การใช้งานที่สอดคล้องกันในทุกอุปกรณ์และเวอร์ชันระบบปฏิบัติการ

เริ่มต้นใช้งาน

Preference คือบล็อกการสร้างพื้นฐานของไลบรารีค่ากำหนด หน้าจอการตั้งค่าจะมีลําดับชั้น Preference คุณสามารถกําหนดลําดับชั้นนี้เป็นทรัพยากร XML หรือสร้างลําดับชั้นในโค้ดก็ได้

ส่วนต่อไปนี้จะอธิบายวิธีสร้างหน้าจอการตั้งค่าแบบง่ายโดยใช้ไลบรารี AndroidX Preference

ก่อนที่คุณจะเริ่มต้น ให้เพิ่มทรัพยากร Dependency ของไลบรารีค่ากำหนดลงในไฟล์ build.gradle ดังนี้

GroovyKotlin
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 เพื่อขยาย ดังที่แสดงในตัวอย่างต่อไปนี้

KotlinJava
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 อื่นๆ ดังนี้

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

ผลลัพธ์จะแสดงในรูปภาพต่อไปนี้

รูปภาพที่แสดงตัวอย่างหน้าจอค่ากําหนด
รูปที่ 1 หน้าจอการตั้งค่าที่สร้างโดยใช้ออบเจ็กต์ Preference 2 รายการ

ตรวจสอบค่ากําหนด

คุณสามารถรับเหตุการณ์เมื่อค่ากําหนดมีการเปลี่ยนแปลงโดยการลงทะเบียน Listener ดังนี้

KotlinJava
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 โดยทั่วไป

KotlinJava
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