设置 Android Jetpack 的一部分。
通过设置,用户可以更改应用的功能和行为。设置可能会影响后台行为,例如应用与云同步数据的频率;也可能有更显著的影响,例如改变界面的内容和呈现方式。
如需将用户可配置的设置集成到您的应用中,请使用 AndroidX Preference 库。此库管理界面,并与存储空间交互,因此您只需定义用户可以配置的各项设置。该库采用 Material Design 主题,可在各种设备和操作系统版本之间提供一致的用户体验。
开始使用
Preference
是 Preference 库的基本构建块。设置屏幕包含 Preference
层次结构。您可将此层次结构定义为 XML 资源,或在代码中构建层次结构。
以下部分介绍了如何使用 AndroidX Preference 库构建简单的设置屏幕。
在开始之前,请将 Preference 库依赖项添加到 build.gradle
文件中:
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
,和一个没有 widget 的基本 Preference
。
构建层次结构时,每个 Preference
都必须具有唯一的键。
膨胀层次结构
如需从 XML 属性膨胀层次结构,需要先创建一个 PreferenceFragmentCompat
,替换 onCreatePreferences()
,然后提供 XML 资源进行膨胀,如以下示例所示:
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
一样,您可按以下方式将此 Fragment
添加到您的 Activity
:
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();
}
}
结果如下图所示:
监控偏好设置
您可以通过为偏好设置注册监听器,在偏好设置发生变化时接收事件:
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
一样读取这些值:
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 中输出这些值。