تنظیمات خود را سفارشی کنید بخشی از 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 روی false تنظیم کنید، همانطور که در مثال زیر نشان داده شده است:

<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 را نشان می دهد
شکل 1. یک مثال 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 سفارشی کنید. این شنونده زمانی که دیالوگ به کاربر نشان داده می شود فراخوانی می شود.

به عنوان مثال، می توانید یک گفتگو را طوری سفارشی کنید که فقط اعداد را بپذیرد. ابتدا 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 تنظیم کنید

می‌توانید یک Intent on Preference را تنظیم کنید تا هر زمان که روی Preference ضربه می‌زنید، یک Fragment ، Activity یا برنامه جداگانه راه‌اندازی شود. این همان استفاده از 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);

همچنین می توانید با استفاده از XML موارد اضافی را با Intent اضافه کنید:

<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 تنظیم کنید، که وقتی روی Preference ضربه زده می‌شود، یک تماس برگشتی به onPreferenceClick() اضافه می‌کند. برای مثال، اگر منطق پیچیده‌تری برای مدیریت پیمایش دارید، می‌توانید از شنونده برای پیمایش به Fragment یا Activity دیگری استفاده کنید.

برای تنظیم OnPreferenceClickListener ، از کدی شبیه به زیر استفاده کنید:

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