سفارشی‌سازی کردن تنظیمات   بخشی از 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 را نشان می‌دهد
شکل ۱. نمونه 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 را روی 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("webpage")
webpagePreference?.intent = intent

جاوا

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;
});