ปรับแต่งการตั้งค่า เป็นส่วนหนึ่งของ Android Jetpack
เอกสารนี้อธิบายวิธีปรับแต่ง
Preference
ในลำดับชั้น
ค้นหาค่ากำหนด
เพื่อเข้าถึง Preference
แต่ละรายการ เช่น เมื่อรับหรือตั้งค่า
ค่า Preference
ใช้
PreferenceFragmentCompat.findPreference()
วิธีนี้จะค้นหาทั้งลำดับชั้นสำหรับ Preference
ด้วยคีย์ที่ระบุ
เช่น หากต้องการเข้าถึง
EditTextPreference
ที่มี
คีย์ "signature"
ให้ทำดังนี้
<EditTextPreference
app:key="signature"
app:title="Your signature"/>
เรียกข้อมูล Preference
นี้โดยใช้รหัสต่อไปนี้:
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
setPreferencesFromResource(R.xml.preferences, rootKey)
val signaturePreference: EditTextPreference? = findPreference("signature")
// Do something with this preference.
}
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
setPreferencesFromResource(R.xml.preferences, rootKey);
EditTextPreference signaturePreference = findPreference("signature");
// Do something with this preference.
}
ควบคุมการแสดงค่ากำหนด
คุณควบคุมได้ว่าจะให้ผู้ใช้เห็นออบเจ็กต์ Preference
ใดบ้างเมื่อ
ให้ไปที่หน้าจอการตั้งค่า ตัวอย่างเช่น หาก Preference
บางรายการเป็น
มีความหมายเฉพาะเมื่อมีการเปิดใช้งานคุณลักษณะที่เกี่ยวข้องเท่านั้น คุณอาจต้องการซ่อน
Preference
เมื่อปิดใช้ฟีเจอร์
หากต้องการแสดง Preference
เมื่อตรงตามเงื่อนไขเท่านั้น ให้ตั้งค่า Preference
ก่อน
การเปิดเผย false ใน XML ดังที่ปรากฏในตัวอย่างต่อไปนี้:
<EditTextPreference
app:key="signature"
app:title="Your signature"
app:isPreferenceVisible="false"/>
ใน onCreatePreferences()
ให้แสดง Preference
เมื่อ
ตรงตามเงื่อนไข:
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
setPreferencesFromResource(R.xml.preferences, rootKey)
if(/*some feature*/) {
val signaturePreference: EditTextPreference? = findPreference("signature")
signaturePreference?.isVisible = true
}
}
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
setPreferencesFromResource(R.xml.preferences, rootKey);
if(/*some feature*/) {
EditTextPreference signaturePreference = findPreference("signature");
if (signaturePreference != null) {
signaturePreference.setVisible(true);
}
}
}
อัปเดตสรุปแบบไดนามิก
Preference
ที่ยังคงมีข้อมูลอยู่ต้องแสดงค่าปัจจุบันใน
สรุป เพื่อช่วยให้ผู้ใช้เข้าใจสถานะปัจจุบันของ
Preference
เช่น EditTextPreference
ต้องแสดงข้อความที่บันทึกไว้
และ ListPreference
จะต้องแสดงรายการที่เลือกไว้ คุณอาจ
มี Preference
ออบเจ็กต์ที่ต้องอัปเดตข้อมูลสรุปโดยอิงตามภายใน หรือ
สถานะแอปภายนอก เช่น Preference
ที่แสดงเวอร์ชัน
หมายเลข โดยใช้
SummaryProvider
ใช้ SimpleSummaryProvider
ListPreference
และ
EditTextPreference
รวมการติดตั้งใช้งาน SummaryProvider
แบบง่ายที่แสดง
บันทึกค่า Preference
เป็นข้อมูลสรุป หากไม่มีการบันทึกค่า จะแสดงข้อความ "ไม่ใช่
ตั้งค่า"
หากต้องการเปิดใช้การติดตั้งใช้งานเหล่านี้จาก XML ให้ตั้งค่า
app:useSimpleSummaryProvider="true"
อีกวิธีหนึ่งคือ คุณสามารถใช้
ListPreference.SimpleSummaryProvider.getInstance()
และ
EditTextPreference.SimpleSummaryProvider.getInstance()
เพื่อรับอินสแตนซ์ SummaryProvider
แบบง่าย แล้วตั้งค่าใน
Preference
ตามที่แสดงในตัวอย่างต่อไปนี้
listPreference.summaryProvider = ListPreference.SimpleSummaryProvider.getInstance()
editTextPreference.summaryProvider = EditTextPreference.SimpleSummaryProvider.getInstance()
listPreference.setSummaryProvider(ListPreference.SimpleSummaryProvider.getInstance());
editTextPreference.setSummaryProvider(EditTextPreference.SimpleSummaryProvider.getInstance());
ใช้ InsightsProvider ที่กำหนดเอง
คุณสามารถสร้าง SummaryProvider
ของคุณเองและลบล้างได้
provideSummary()
เพื่อปรับแต่งข้อมูลสรุปเมื่อใดก็ตามที่ Preference
ขอ สำหรับ
ตัวอย่างเช่น EditTextPreference
ต่อไปนี้จะแสดงความยาวของที่บันทึกไว้
เป็นข้อมูลสรุป:

EditTextPreference
ในตัวอย่างนี้ สมมติ EditTextPreference
ดังต่อไปนี้
<EditTextPreference
app:key="counting"
app:title="Counting preference"/>
ใน onCreatePreferences()
คุณสามารถสร้าง SummaryProvider
ใหม่และลบล้าง
provideSummary()
เพื่อแสดงสรุปที่จะแสดง:
val countingPreference: EditTextPreference? = findPreference("counting")
countingPreference?.summaryProvider = SummaryProvider<EditTextPreference> { preference ->
val text = preference.text
if (text.isNullOrEmpty()) {
"Not set"
} else {
"Length of saved value: " + text.length
}
}
EditTextPreference countingPreference = findPreference("counting");
if (countingPreference != null) {
countingPreference.setSummaryProvider(new SummaryProvider<EditTextPreference>() {
@Override
public CharSequence provideSummary(EditTextPreference preference) {
String text = preference.getText();
if (TextUtils.isEmpty(text) || text == null){
return "Not set";
}
return "Length of saved value: " + text.length();
}
});
}
ข้อมูลสรุป Preference
จะแสดงความยาวของค่าที่บันทึกไว้หรือ "ไม่ได้ตั้งค่า"
เมื่อไม่มีค่าที่บันทึกไว้
ปรับแต่งกล่องโต้ตอบ EditTextPreference
ในกล่องโต้ตอบ EditTextPreference
คุณสามารถปรับแต่งการทำงานของช่องข้อความได้โดย
กำลังแนบไฟล์
OnBindEditTextListener
Listener นี้จะถูกเรียกใช้เมื่อกล่องโต้ตอบแสดงต่อผู้ใช้
เช่น คุณสามารถปรับแต่งกล่องโต้ตอบให้ยอมรับเฉพาะตัวเลขได้ ขั้นแรก สร้าง
EditTextPreference
:
<EditTextPreference
app:key="number"
app:title="Numbers only preference"/>
จากนั้น ใน onCreatePreferences()
ให้สร้าง OnBindEditTextListener
ใหม่และ
ลบล้าง onBindEditText()
เพื่อปรับแต่ง EditText
เมื่อแสดงต่อ
ผู้ใช้
val numberPreference: EditTextPreference? = findPreference("number")
numberPreference?.setOnBindEditTextListener { editText ->
editText.inputType = InputType.TYPE_CLASS_NUMBER
}
EditTextPreference numberPreference = findPreference("number");
if (numberPreference != null) {
numberPreference.setOnBindEditTextListener(
new EditTextPreference.OnBindEditTextListener() {
@Override
public void onBindEditText(@NonNull EditText editText) {
editText.setInputType(InputType.TYPE_CLASS_NUMBER);
}
});
}
ตอนนี้เมื่อกล่องโต้ตอบแสดงต่อผู้ใช้ แป้นพิมพ์จะเปิดขึ้นเป็นตัวเลขเท่านั้น
เพื่อให้ผู้ใช้ป้อนเฉพาะตัวเลขลงใน EditText
ได้
การดำเนินการที่ต้องการ
Preference
จะมีการดำเนินการที่เจาะจงเมื่อแตะ ตัวอย่างเช่น
Preference
ทำหน้าที่เป็นลิงก์ไปยังส่วนแยกต่างหากของแอปได้ วิธีเพิ่มการดำเนินการ
เป็น Preference
คุณจะตั้งค่า Intent
ใน Preference
ได้โดยตรง หรือคุณจะตั้งค่า
สามารถตั้งค่า
OnPreferenceClickListener
สำหรับตรรกะที่เฉพาะเจาะจงมากขึ้น
ตั้งค่าความตั้งใจ
คุณสามารถตั้งค่า Intent
ใน Preference
เพื่อเปิดตัว Fragment
ใหม่
Activity
หรือแยกแอปเมื่อใดก็ตามที่แตะ Preference
นี่คือ
เท่ากับการใช้
Context.startActivity()
ด้วย Intent
ที่ระบุ
คุณสามารถตั้งค่า Intent
ใน XML โดยใช้แท็ก <intent>
ที่ฝังอยู่ ดังต่อไปนี้
ตัวอย่างกำหนด Intent
ที่เรียกใช้ Activity
<Preference
app:key="activity"
app:title="Launch activity">
<intent
android:targetPackage="com.example"
android:targetClass="com.example.ExampleActivity"/>
</Preference>
หรือใช้ setIntent()
ใน Preference
โดยตรงก็ได้ ดังนี้
val intent = Intent(context, ExampleActivity::class.java)
activityPreference.setIntent(intent)
Intent intent = new Intent(getContext(), ExampleActivity.class);
activityPreference.setIntent(intent);
คุณยังเพิ่มส่วนเสริมด้วย Intent
โดยใช้ XML ได้ด้วย:
<Preference
app:key="activity"
app:title="Launch activity">
<intent
android:targetPackage="com.example"
android:targetClass="com.example.ExampleActivity">
<extra
android:name="example_key"
android:value="example_value"/>
</intent>
</Preference>
ต่อไปนี้คือตัวอย่างของ Preference
ที่มี Intent
ที่เปิดหน้าเว็บ
<Preference
app:key="webpage"
app:title="View webpage">
<intent
android:action="android.intent.action.VIEW"
android:data="http://www.google.com" />
</Preference>
val intent = Intent(Intent.ACTION_VIEW)
intent.data = Uri.parse("http://www.google.com")
val webpagePreference = findPreference
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.google.com"));
webpagePreference.setIntent(intent);
OnPreferenceClickListener
คุณตั้งค่า OnPreferenceClickListener
ใน Preference
ได้ ซึ่งจะเพิ่ม
โทรกลับไปยัง onPreferenceClick()
เมื่อมีการแตะ Preference
ตัวอย่างเช่น
คุณสามารถใช้ Listener เพื่อนำทางไปยัง Fragment
หรือ Activity
อื่นหากคุณ
มีตรรกะที่ซับซ้อนมากขึ้นในการจัดการการนำทาง
หากต้องการตั้งค่า OnPreferenceClickListener
ให้ใช้โค้ดที่คล้ายกับตัวอย่างต่อไปนี้
onClickPreference.setOnPreferenceClickListener({
// Do something.
true
})
onClickPreference.setOnPreferenceClickListener(preference -> {
// Do something.
return true;
});