Preference 是Android App 中重要的控件之一,Settings 模块大部分都是通过 Preference 实现的。
使用方法
一般在 XML 文件夹中创建 xml 文件来对 Settings 进行布局,布局文件中通常使用 PreferenceScreen 容器,PreferenceScreen 包含多个 Preference 控件,PreferenceCategory 可以设置分类标题。
Perference 常用使用方法如下两种:
- 使用 XML 定义 Preference
- 使用 Fragment 定义 Preference
这里只介绍使用 Fragment 定义
在 build.gradle 导入
// preference implementation 'androidx.preference:preference:1.1.1'
注:自 Android 10 开始,系统已弃用 android.preference 库平台。
最新库地址请查看:https://developer.android.com/jetpack/androidx/releases/preference?hl=zh-cn
方便管理我们在 res 资源文件夹里新建一个名为 xml 的文件夹,然后在 res/xml 中新建 xml 文件,命名为:preference_settings
<?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <!-- 基本设置 --> <PreferenceCategory app:title="@string/settings_category_basic"> <!-- 打印 IP --> <EditTextPreference app:key="@string/settings_print_ip_key" app:defaultValue="@string/settings_print_ip_default_value" app:icon="@drawable/ic_credit_card_theme" app:dialogIcon="@drawable/ic_credit_card_theme" app:singleLine="true" app:summary="@string/settings_print_ip_current" app:title="@string/settings_print_ip" /> </PreferenceCategory> </PreferenceScreen>
自定义 SettingsFragment
,继承 PreferenceFragmentCompat
import androidx.preference.EditTextPreference; import androidx.preference.ListPreference; import androidx.preference.Preference; import androidx.preference.PreferenceFragmentCompat; import androidx.preference.PreferenceManager; import com.izpan.app.R; import com.xuexiang.xui.utils.ResUtils; import com.xuexiang.xutil.common.ObjectUtils; /** * @author payne.zhuang <payne.zhuang@gosonic.com.cn> * @ClassName: SettingsFragment * @Description: 设置界面 Fragment * @copyright (C), 2020 izpan <https://izpan.com> * @date 2020/8/26 - 10:19 */ public class SettingsFragment extends PreferenceFragmentCompat { // 设置打印机IP Key private static final String SETTINGS_PRINT_IP = ResUtils.getString(R.string.settings_print_ip_key); @Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { setPreferencesFromResource(R.xml.preference_settings, rootKey); bindPreferenceSummaryToValue(SETTINGS_PRINT_IP); } /** * 绑定值修改 value */ private void bindPreferenceSummaryToValue(String key) { Preference preference = findPreference(key); assert preference != null; preference.setOnPreferenceChangeListener(onPreferenceChangeListener); onPreferenceChangeListener.onPreferenceChange(preference, PreferenceManager.getDefaultSharedPreferences(preference.getContext()).getString(preference.getKey(), "")); } /** * 动态监听 */ private Preference.OnPreferenceChangeListener onPreferenceChangeListener = (preference, value) -> { String stringValue = value.toString(); if (preference instanceof ListPreference) { // 列表 ListPreference ListPreference listPreference = (ListPreference) preference; int index = listPreference.findIndexOfValue(stringValue); onPreferenceChange(listPreference, index >= 0 ? listPreference.getEntries()[index] : null); } else if (preference instanceof EditTextPreference) { // 文本框 EditTextPreference onPreferenceChange(preference, stringValue); } return true; }; /** * 修改值 */ private void onPreferenceChange(Preference preference, Object newValue) { preference.setSummary(ObjectUtils.isEmpty(newValue) ? "" : String.valueOf(newValue)); } }
这里只处理了 列表 ListPreference
和 文本框 EditTextPreference
,其他控件请自行扩展
官方指导参考地址:https://developer.android.com/guide/topics/ui/settings?hl=zh-cn