设置 Android Jetpack 的一部分。
通过设置,用户可以更改应用的功能和行为。设置可以影响后台行为(例如应用与云端同步数据的频率),也可以影响更广泛的范围(例如更改界面的内容和呈现方式)。
如需将用户可配置的设置集成到您的应用中,请使用 AndroidX Preference 库。此库管理界面并与存储空间交互,因此您只需定义用户可以配置的各项设置。该库自带 Material Design 主题,可在各种设备和操作系统版本之间提供一致的用户体验。
开始使用
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
,另一个是不带 widget 的基本 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
一样,将此 Fragment
添加到 Activity
:
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(); } }
结果如下图所示:
![一张显示“偏好设置”屏幕示例的图片](https://developer.android.google.cn/static/develop/ui/views/components/settings/images/settings-simple.png?authuser=5&hl=fi)
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
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 中输出这些值。