設定 Android Jetpack 的一部分。

使用者可透過設定變更應用程式的功能和行為。設定 會影響背景行為,例如應用程式與 也可以擴大觸及範圍,例如變更內容和 使用者介面的呈現方式

如要將使用者配置的設定整合至您的應用程式,請使用 AndroidX Preference 程式庫。這個程式庫會管理使用者介面,並與 Storage 可讓您只定義使用者 設定。這個程式庫提供 Material Design 主題, 在不同裝置和 OS 版本上提供一致的使用者體驗

開始使用

Preference 是基本建構 偏好設定程式庫區塊設定畫麵包含Preference 「階層」。您可以將此階層定義為 XML 資源,或是建立 程式碼中的階層結構

以下各節將說明如何使用 AndroidX Preference Library。

開始設定前,請將 Preference 程式庫依附元件新增至 build.gradle 檔案:

Groovy

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

Kotlin

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 資源,如以下範例所示:

Kotlin

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

Java

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

接著,您可以將此 Fragment 新增至 Activity,方法與方式相同 Fragment:

Kotlin

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

Java

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

結果如下圖所示:

顯示偏好設定畫面範例的圖片
圖 1. 使用兩個 Preference 建立的設定畫面 如需儲存大量結構化物件 建議使用 Cloud Bigtable

監控偏好設定

您可以在偏好設定變更時取得事件,方法是為 它:

Kotlin

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.
    }

Java

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:

Kotlin

val preferences = PreferenceManager.getDefaultSharedPreferences(this).all

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

Java

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

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

先前的程式碼片段會取得以下項目的預設 SharedPreferences 執行個體: 應用程式,存取所有儲存的值、進行迴圈及輸出 Logcat。