تنظیمات   بخشی از Android Jetpack.

تنظیمات به کاربران اجازه می‌دهد عملکرد و رفتار برنامه را تغییر دهند. تنظیمات می‌تواند بر رفتار پس‌زمینه تأثیر بگذارد، مثلاً اینکه برنامه چندوقت یک‌بار داده‌ها را با ابر همگام‌سازی کند، یا می‌تواند تأثیر گسترده‌تری داشته باشد، مثلاً تغییر محتوا و ارائه میانای کاربر.

برای ادغام تنظیمات قابل‌پیکربندی کاربر در برنامه‌تان، از کتابخانه AndroidX Preference استفاده کنید. این کتابخانه میانای کاربر را مدیریت می‌کند و با فضای ذخیره‌سازی تعامل دارد تا شما فقط تنظیمات فردی را که کاربر می‌تواند پیکربندی کند تعریف کنید. این کتابخانه با یک زمینه «طراحی مواد» ارائه می‌شود که تجربه کاربری ثابتی را در دستگاه‌ها و نسخه‌های سیستم‌عامل مختلف فراهم می‌کند.

شروع کنید

Preference واحد سازنده پایه کتابخانه Preference است. صفحه تنظیمات حاوی Preference سلسله‌مراتب است. می‌توانید این سلسله‌مراتب را به‌عنوان منبع XML تعریف کنید، یا می‌توانید سلسله‌مراتبی در کد بسازید.

بخش‌های زیر نحوه ساختن صفحه تنظیمات ساده را بااستفاده از کتابخانه اولویت AndroidX شرح می‌دهد.

قبل‌از شروع، وابستگی کتابخانه «اولویت» را به فایل build.gradle خود اضافه کنید:

شیک

dependencies {
    implementation "androidx.preference:preference-ktx:1.2.0"
}

کاتلین

dependencies {
    implementation("androidx.preference:preference-ktx:1.2.0")
}

پس‌از «همگام‌سازی Gradle»، می‌توانید به بخش XML تکلیف بروید.

ایجاد سلسله مراتب

در پروژه خود، به پوشه res/xml بروید، فایل preferences.xml را ایجاد کنید، و کد زیر را به آن اضافه کنید:

<PreferenceScreen
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <SwitchPreferenceCompat
        app:key="notifications"
        app:title="Enable message notifications"/>

    <Preference
        app:key="feedback"
        app:title="Send feedback"
        app:summary="Report technical issues or suggest new features"/>

</PreferenceScreen>

این سلسله‌مراتب شامل دو شیء Preference است: SwitchPreferenceCompat که به کاربران اجازه می‌دهد تنظیمات را روشن و خاموش کنند، و یک Preference پایه بدون ابزاره.

هنگام ساختن سلسله‌مراتب، هر Preference باید کلید یکتایی داشته باشد.

گسترش سلسله‌مراتب

برای گسترش سلسله‌مراتب از یک ویژگی XML، یک PreferenceFragmentCompat ایجاد کنید، onCreatePreferences() را لغو کنید، و منبع XML را برای گسترش ارائه دهید، همان‌طور که در مثال زیر نشان داده شده است:

کاتلین

class MySettingsFragment : PreferenceFragmentCompat() {
    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
        setPreferencesFromResource(R.xml.preferences, rootKey)
    }
}

جاوا

public class MySettingsFragment extends PreferenceFragmentCompat {
    @Override
    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
        setPreferencesFromResource(R.xml.preferences, rootKey);
    }
}

سپس می‌توانید این Fragment را به Activity خود اضافه کنید، درست مانند هر Fragment دیگری:

کاتلین

class MySettingsActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        supportFragmentManager
                .beginTransaction()
                .replace(R.id.settings_container, MySettingsFragment())
                .commit()
    }
}

جاوا

public class MySettingsActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getSupportFragmentManager()
                .beginTransaction()
                .replace(R.id.settings_container, new MySettingsFragment())
                .commit();
    }
}

نتیجه در تصویر زیر نشان داده شده است:

تصویری که نمونه‌ای از صفحه «اولویت» را نشان می‌دهد
شکل ۱. صفحه تنظیماتی که بااستفاده از دو شیء Preference ایجاد شده است.

پایش اولویت‌ها

با ثبت شنونده برای اولویت، می‌توانید هنگام تغییر اولویت رویدادی دریافت کنید:

کاتلین

findPreference<SwitchPreferenceCompat>("notifications")
    ?.setOnPreferenceChangeListener { _, newValue ->
        Log.d("Preferences", "Notifications enabled: $newValue")
        true // Return true if the event is handled.
    }

findPreference<Preference>("feedback")
    ?.setOnPreferenceClickListener {
        Log.d("Preferences", "Feedback was clicked")
        true // Return true if the click is handled.
    }

جاوا

SwitchPreferenceCompat notificationsPref = findPreference("notifications");

if (notificationsPref != null) {
    notificationsPref.setOnPreferenceChangeListener((preference, newValue) -> {
        Log.d("Preferences", String.format("Notifications enabled: %s", newValue));
        return true; // Return true if the event is handled.
    });
}

Preference feedbackPref = findPreference("feedback");

if (feedbackPref != null) {
    feedbackPref.setOnPreferenceClickListener((preference) -> {
        Log.d("Preferences", "Feedback was clicked");
        return true; // Return true if the event is handled.
    });
}

خواندن مقدار اولویت فعلی

PreferenceFragmentCompat بیشتر سازوکار مربوط به ذخیره و خواندن اولویت‌ها را پنهان می‌کند. بااین‌حال، همه چیز بااستفاده از SharedPreferences ذخیره می‌شود و می‌توانید این مقادیر را همان‌طور که معمولاً با SharedPreferences انجام می‌دهید بخوانید:

کاتلین

val preferences = PreferenceManager.getDefaultSharedPreferences(this).all

preferences.forEach {
    Log.d("Preferences", "${it.key} -> ${it.value}")
}

جاوا

var preferences = PreferenceManager.getDefaultSharedPreferences(context).getAll();

preferences.forEach((key, value) ->{
    Log.d("Preferences", String.format("%s -> %s", key, value));
});

قطعه کد قبلی نمونه‌ای از SharedPreferences پیش‌فرض را برای برنامه دریافت می‌کند، به همه مقادیر ذخیره‌شده دسترسی پیدا می‌کند، آن‌ها را تکرار می‌کند، و آن‌ها را در Logcat چاپ می‌کند.