ปรับแต่งการตั้งค่า เป็นส่วนหนึ่งของ Android Jetpack
เอกสารนี้อธิบายวิธีปรับแต่ง
Preference ในลำดับชั้น
ค้นหาค่ากำหนด
เพื่อเข้าถึง Preference แต่ละรายการ เช่น เมื่อรับหรือตั้งค่า
ค่า Preference ใช้
PreferenceFragmentCompat.findPreference()
วิธีนี้จะค้นหาทั้งลำดับชั้นสำหรับ Preference ด้วยคีย์ที่ระบุ
เช่น หากต้องการเข้าถึง
EditTextPreference ที่มี
คีย์ "signature" ให้ทำดังนี้
<EditTextPreference app:key="signature" app:title="Your signature"/>
เรียกข้อมูล Preference นี้โดยใช้รหัสต่อไปนี้:
Kotlin
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.preferences, rootKey) val signaturePreference: EditTextPreference? = findPreference("signature") // Do something with this preference. }
Java
@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 เมื่อ
ตรงตามเงื่อนไข:
Kotlin
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.preferences, rootKey) if(/*some feature*/) { val signaturePreference: EditTextPreference? = findPreference("signature") signaturePreference?.isVisible = true } }
Java
@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 ตามที่แสดงในตัวอย่างต่อไปนี้
Kotlin
listPreference.summaryProvider = ListPreference.SimpleSummaryProvider.getInstance() editTextPreference.summaryProvider = EditTextPreference.SimpleSummaryProvider.getInstance()
Java
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() เพื่อแสดงสรุปที่จะแสดง:
Kotlin
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 } }
Java
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 เมื่อแสดงต่อ
ผู้ใช้
Kotlin
val numberPreference: EditTextPreference? = findPreference("number") numberPreference?.setOnBindEditTextListener { editText -> editText.inputType = InputType.TYPE_CLASS_NUMBER }
Java
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 โดยตรงก็ได้ ดังนี้
Kotlin
val intent = Intent(context, ExampleActivity::class.java) activityPreference.setIntent(intent)
Java
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>
Kotlin
val intent = Intent(Intent.ACTION_VIEW) intent.data = Uri.parse("http://www.google.com") val webpagePreference = findPreference("webpage") webpagePreference?.intent = intent
Java
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 ให้ใช้โค้ดที่คล้ายกับตัวอย่างต่อไปนี้
Kotlin
onClickPreference.setOnPreferenceClickListener({ // Do something. true })
Java
onClickPreference.setOnPreferenceClickListener(preference -> { // Do something. return true; });