Android Jetpack 的「設定」部分

設定可讓使用者變更應用程式的功能和行為。設定會影響背景行為,例如應用程式與雲端同步處理資料的頻率,也可能影響範圍 (例如變更使用者介面的內容和呈現方式)。

如果想在應用程式中整合使用者可配置的設定,請使用 AndroidX Preference 程式庫。這個程式庫會管理使用者介面並與儲存空間互動,因此您只能定義使用者可調整的個別設定。這個程式庫提供質感設計主題,可在各種裝置和 OS 版本上提供一致的使用者體驗。

開始使用

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

以下各節說明如何使用 AndroidX Preference 程式庫建立簡易的設定畫面。

在開始之前,請將 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 物件建立的設定畫面。

監控偏好設定

只要為偏好設定註冊事件監聽器,即可在偏好設定有所變更時取得事件:

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

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

讀取目前的偏好設定值

PreferenceFragmentCompat 會隱藏儲存和讀取偏好設定時所涉及的大部分機器。不過,所有內容都是使用 SharedPreferences 儲存,您可以照常使用 SharedPreferences 讀取這些值:

Kotlin

val preferences = PreferenceManager.getDefaultSharedPreferences(this).all

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

Java

val preferences = PreferenceManager.getDefaultSharedPreferences(this).all

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

先前的程式碼片段會取得應用程式預設 SharedPreferences 的執行個體、存取所有儲存的值、對這些值執行迴圈,然後在 Logcat 中顯示這些值。