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(); } }
結果如下圖所示:
監控偏好設定
只要為偏好設定註冊事件監聽器,即可在偏好設定有所變更時取得事件:
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 中顯示這些值。