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

2023-05-16

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android preference控件,Android Preference 设置项简单使用详解 的相关文章

  • PopupWindow onitemclick 中的 Android Listview 在某些设备上不起作用

    我的 ListView 在 PopupWindow 内 当我显示 PopupWindow 并单击设备 ASUS K00z 中的 Listview 行时 fonepad 工作得很好 但在 HTC Z715e 中不起作用 项目单击事件未触发 1
  • 将JSON数据解析到Android ListView中

    我已经潜伏这个网站很长一段时间了 幸运的是 到目前为止我所有的问题都得到了解答 我希望你们中的一些人能够阐明我的问题 我可以成功地让 ListView 来显示字符串数组 但是当我尝试将 JSON 数据解析为数组时 我的程序只是强制关闭 而
  • app-release-unsigned.apk 未签名

    我在 github 上下载了 Android 应用程序的 zip 文件 并尝试运行它 但出现一个包含此消息的对话框 app release unsigned apk is not signed Please configure the si
  • 我如何从android中的复选框获取值

    我想获取复选框中所选项目的名称 但我只得到一些字母数字 如何从复选框中获取所选项目的名称 public View getView int position View convertView ViewGroup parent View vie
  • 有人可以给出一个 android 中 webview 实现的确切例子吗

    嗨 我正在使用开发 Android 应用程序WebView执行 我跟着官方安卓教程 http developer android com resources tutorials views hello webview html 在 Ecli
  • 作为附件的 Android 设备

    我有 2 个 Android 设备 我想用 USB OTG 电缆连接它们 并在两个设备之间进行来回通信 据我了解 一台 Android 设备将充当 USB 主机 运行 4 4 的 Nexus 7 另一台 Android 设备将充当 USB
  • Android Studio 安装失败,APK 未签名

    最近从 Eclipse 更改为 Android Studio 我还更改了 JDKjava open jdk to jdk1 7 0 45 现在我尝试运行我的第一个应用程序 并收到以下消息 Installation failed since
  • org.apache.http.conn.HttpHostConnectException:在 android 中连接到 http://localhost 被拒绝

    我正在制作一个应用程序 在执行它时将图像上传到服务器并将其数据库更新到android中的服务器 它显示错误 Connection to http localhost refused 还有更多错误 我研究了这个问题 发现不是提供 URL 连接
  • startActivityForResult中的requestCode是什么意思

    我想知道我是否正确理解 requestCode 的概念 这个整数的用途是什么 我将其设置为哪个整数有关系吗 private static int CAMERA REQUEST 谢谢 requestCode 可帮助您识别您从哪个 Intent
  • 垂直从上到下线手势检测器

    我用的是 手势工具 注意到对于垂直从上到下的线无法检测 因为我在代码中使用生成的手势文件 如下所示 但无法检测垂直从上到下的线手势检测 import java util ArrayList import android app Activi
  • Android 媒体播放器搜索栏

    我有一个创建 播放和处理媒体播放器 只是音频 的服务 但我在主要活动中有一个搜索栏 我想自然地显示音频文件的进度并允许用户搜索到不同的位置 我花了很长时间才弄清楚 将 UI 中的搜索栏连接到服务中的媒体播放器的最佳或正确方法是什么 我将这样
  • 调整 SwipeRefreshLayout 高度,将 View 置于其底部

    I have SwipeRefreshLayout里面一个RelativeLayout 问题是SwipeRefreshLayout占据了屏幕上的所有位置 我需要放置一个视图after这个观点 看图片 https i stack imgur
  • 将触摸事件从 NestedScrollView 传递到父视图

    我在 NestedScrollView 下方有一个 ViewPager 宽度一些顶部填充 以及 ClipToPadding false 和透明背景 如图像 我的 ViewPager 无法获取触摸事件并且无法工作 我怎么解决这个问题 我无法更
  • Android OptionsMenu问题,背景始终透明

    我的选项菜单总是不显示背景 背景是透明的 有谁知道如何摆脱这个 我的失败起源活动是从另一个自定义活动扩展的 我在 eclipse 上有这个项目 选项菜单工作正常 但自从我迁移到 AndroidStudio 后 选项菜单始终是透明的 我尝试更
  • 如何从一个活动检索 Double 值到另一活动?

    我制作了一个包含 2 个活动的应用程序 其中第一个活动包含一些 EditText 十进制数字 另一个活动也包含一些 EditText 十进制 现在我想将一个 EditText 的值传递给另一个 但作为 双 而不是作为一个字符串 因为该值将用
  • 如何检测日期选择器对话框的取消单击?

    我正在使用以下 日期选择器的示例 http developer android com guide tutorials views hello datepicker html http developer android com guide
  • 如何解决android程序中的警告“从不本地读取”

    为什么我收到警告说 The field testscreen ScaleAnimToShow mVanishAfter is never read locally testscreen java testscreen src com tes
  • Android Studio 中自动打开“运行设备”选项卡

    在 Android Studio Flamingo 中有一个名为跑步设备并且它会在每次之后自动打开运行应用程序 有办法禁止这个自动打开吗 我尝试禁用启用物理 Android 设备的镜像选项 但选项卡仍然自动打开 基于此issue https
  • Android Volley - 发布请求 - 无法在线工作

    我试图通过 Volley 发出 POST 请求 它在我的本地主机中工作得很好 但是当我将它移动到网络服务器时 响应为空 Java代码 RequestQueue queue Volley newRequestQueue this String
  • Android Google 地图无法在当前主题中找到样式“mapViewStyle”

    添加谷歌地图视图时 我扩展了MapView 使用xml编辑器将其添加到活动中 并将我的谷歌地图api密钥手动添加到布局xml文件中 我的权限在清单文件中允许互联网 我想知道的是 在 xml 编辑器中 我收到错误 无法在当前主题中找到样式 m

随机推荐