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 库平台。
方便管理我们在 res 资源文件夹里新建一个名为 xml 的文件夹,然后在 res/xml 中新建 xml 文件,命名为:preference_settings
xmlns:app="http://schemas.android.com/apk/res-auto">
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" />
自定义 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
* @ClassName: SettingsFragment
* @Description: 设置界面 Fragment
* @copyright (C), 2020 izpan
* @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,其他控件请自行扩展