ปรับแต่งการตั้งค่า เป็นส่วนหนึ่งของ Android Jetpack

เอกสารนี้อธิบายวิธีปรับแต่ง Preference ในลำดับชั้น

ค้นหาค่ากำหนด

เพื่อเข้าถึง Preference แต่ละรายการ เช่น เมื่อรับหรือตั้งค่า ค่า Preference ใช้ PreferenceFragmentCompat.findPreference() วิธีนี้จะค้นหาทั้งลำดับชั้นสำหรับ Preference ด้วยคีย์ที่ระบุ

เช่น หากต้องการเข้าถึง EditTextPreference ที่มี คีย์ "signature" ให้ทำดังนี้

<EditTextPreference
       
app:key="signature"
       
app:title="Your signature"/>

เรียกข้อมูล Preference นี้โดยใช้รหัสต่อไปนี้:

KotlinJava
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 เมื่อ ตรงตามเงื่อนไข:

KotlinJava
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 ตามที่แสดงในตัวอย่างต่อไปนี้

KotlinJava
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
รูปที่ 1 ตัวอย่าง EditTextPreference

ในตัวอย่างนี้ สมมติ EditTextPreference ดังต่อไปนี้

<EditTextPreference
       
app:key="counting"
       
app:title="Counting preference"/>

ใน onCreatePreferences() คุณสามารถสร้าง SummaryProvider ใหม่และลบล้าง provideSummary() เพื่อแสดงสรุปที่จะแสดง:

KotlinJava
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 เมื่อแสดงต่อ ผู้ใช้

KotlinJava
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 โดยตรงก็ได้ ดังนี้

KotlinJava
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>
KotlinJava
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 ให้ใช้โค้ดที่คล้ายกับตัวอย่างต่อไปนี้

KotlinJava
onClickPreference.setOnPreferenceClickListener({
   
// Do something.
   
true
})
onClickPreference.setOnPreferenceClickListener(preference -> {
   
// Do something.
   
return true;
});