התאמה אישית של ההגדרות חלק מ-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
ב-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());
שימוש ב-SummaryProvider בהתאמה אישית
אפשר ליצור 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
. לדוגמה,
אפשר להשתמש במאזינים כדי לנווט אל Fragment
או Activity
אחרים אם
יש לוגיקה מורכבת יותר בטיפול בניווט.
כדי להגדיר OnPreferenceClickListener
, צריך להשתמש בקוד שדומה לזה:
onClickPreference.setOnPreferenceClickListener({
// Do something.
true
})
onClickPreference.setOnPreferenceClickListener(preference -> {
// Do something.
return true;
});