android preference控件,Android Preference 设置项简单使用详解

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,其他控件请自行扩展

你可能感兴趣的:(android,preference控件)