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 库平台。

最新库地址请查看: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

后端开发

Android Gson 进行混淆打包导致无法进行解析 Json

2020-8-25 9:29:10

系统工具

MacCleaner 2 Pro Mac 系统综合清理软件套件

2020-6-28 21:04:42

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索