設定   Android Jetpack 的一部分。

使用者可透過設定變更應用程式的功能和行為。設定會影響背景行為,例如應用程式與雲端同步資料的頻率,甚至可能影響更大的範圍,例如變更使用者介面的內容和顯示。

如要將使用者可配置的設定整合至應用程式,請使用 AndroidX Preference 程式庫。這個程式庫會管理使用者介面並與儲存空間互動,因此您只能定義使用者可配置的個別設定。這個程式庫提供 Material Design 主題,可以為各種裝置和 OS 版本提供一致的使用者體驗。

開始使用

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

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

開始前,請在 build.gradle 檔案中新增 Preference 程式庫依附元件:

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

KotlinJava
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 一樣:

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

結果如下圖所示:

顯示偏好設定畫面範例的圖片
圖 1. 使用兩個 Preference 物件建立的設定畫面。

監控偏好設定

您可以為偏好設定註冊事件監聽器,以便在偏好設定變更時取得事件:

KotlinJava
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 讀取這些值:

KotlinJava
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 中顯示這些資料。