当前位置: 首页 > news >正文

Android Preference的使用以及解析

简单使用

  1. values.arrays.xml
<?xml version="1.0" encoding="utf-8"?>
<resources><string-array name="list_entries"><item>Option 1</item><item>Option 2</item><item>Option 3</item></string-array><string-array name="list_values"><item>1</item><item>2</item><item>3</item></string-array>
</resources>
  1. xml.preferences.xml
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"><Preferenceandroid:key="simple_preference"android:summary="This is a simple preference"android:title="Simple Preference" /><CheckBoxPreferenceandroid:defaultValue="false"android:key="checkbox_preference"android:summary="This is a CheckBox"android:title="Check Box Preference" /><EditTextPreferenceandroid:dialogTitle="Enter Text"android:key="edittext_preference"android:summary="Enter your text here"android:title="Edit Text Preference" /><ListPreferenceandroid:defaultValue="1"android:entries="@array/list_entries"android:entryValues="@array/list_values"android:key="list_preference"android:summary="Select an option"android:title="List Preference" /><com.example.kotlinlearn.Preference.CustomSeekBarPreferenceandroid:defaultValue="50"android:key="seekbar_preference"android:title="SeekBar Preference" />
</PreferenceScreen>
  1. SettingsFragment
package com.example.kotlinlearn.Preference
import android.os.Bundle
import android.util.Log
import androidx.preference.CheckBoxPreference
import androidx.preference.EditTextPreference
import androidx.preference.Preference
import androidx.preference.PreferenceFragmentCompat
import com.example.kotlinlearn.R
class SettingsFragment : Preference.OnPreferenceClickListener,Preference.OnPreferenceChangeListener, PreferenceFragmentCompat() {var TAG = "SettingsFragment"override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {setPreferencesFromResource(R.xml.preferences, rootKey)var findPreference = findPreference<EditTextPreference>("edittext_preference")findPreference?.onPreferenceClickListener = thisfindPreference?.onPreferenceChangeListener = this}override fun onPreferenceClick(preference: Preference?): Boolean {Log.d(TAG, "onPreferenceClick: ")return false}override fun onPreferenceChange(preference: Preference?, newValue: Any?): Boolean {Log.d(TAG, "onPreferenceChange: ")return false}
}
  1. PreferenceActivity
package com.example.kotlinlearn.Preferenceimport android.os.Bundle
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import com.example.kotlinlearn.Rclass PreferenceActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_preference)// Display the fragment as the main content.supportFragmentManager.beginTransaction().replace(R.id.fragment_container, SettingsFragment()).commit()}
}

效果
在这里插入图片描述

原理

  1. 布局:RecyclerView进行布局,PreferenceGroupAdapter,重写onCreateViewHolder()、onBindViewHolder()、getItemCount()
    在onCreateViewHolder(ViewGroup parent, int viewType) 中根据viewType判断获取不同的preference。
  2. Preference:底层调用SharedPreferences进行保存。通过以下方法持久化数值。
    persistString,persistStringSet,persistInt,persistFloat,persistLong,persistBoolean
    在这里插入图片描述

自定义Preference

重点在监听view变化,在变化后通过回调,将终值写入SharedPreferences,在初始化的时候读出值并赋给view。

package com.example.kotlinlearn.Preferenceimport android.content.Context
import android.content.res.TypedArray
import android.util.AttributeSet
import androidx.preference.Preference
import androidx.preference.PreferenceViewHolder
import android.widget.SeekBar
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.example.kotlinlearn.Rclass CustomSeekBarPreference(context: Context, attrs: AttributeSet) : Preference(context, attrs) {private var currentValue: Int = 0private var maxValue: Int = 100init {widgetLayoutResource = R.layout.preference_seekbar}override fun onBindViewHolder(holder: PreferenceViewHolder) {super.onBindViewHolder(holder)val seekBar = holder.findViewById(R.id.seekbar) as SeekBarval valueText = holder.findViewById(R.id.seekbar_value) as TextViewseekBar.max = maxValueseekBar.progress = currentValuevalueText.text = currentValue.toString()seekBar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {currentValue = progressvalueText.text = progress.toString()persistInt(progress)}override fun onStartTrackingTouch(seekBar: SeekBar?) {}override fun onStopTrackingTouch(seekBar: SeekBar?) {}})}override fun onGetDefaultValue(a: TypedArray, index: Int): Any {return a.getInt(index, 0)}override fun onSetInitialValue(defaultValue: Any?) {currentValue = getPersistedInt(defaultValue as? Int ?: 0)}
}

ex:

1.当xml中设置组件的id相同时,会导致多个preference的值相同。

相关文章:

Android Preference的使用以及解析

简单使用 values.arrays.xml <?xml version"1.0" encoding"utf-8"?> <resources><string-array name"list_entries"><item>Option 1</item><item>Option 2</item><item>Option 3</item&…...

HCIP——GRE和MGRE

目录 VPN GRE GRE环境的搭建 GRE的报文结构 GRE封装和解封装报文的过程 GRE配置​编辑 R1 R2 GRE实验​​​​​​​​编辑 MGRE 原理 MGRE的配置 R1 R2 R3 R4 查看映射表 抓包 MGRE环境下的RIP网络 综合练习​编辑 VPN 说到GRE&#xff0c;我们先来说个大…...

微信小程序——音乐播放器

一、界面设计 播放页面&#xff1a; 显示当前播放歌曲的封面图片、歌曲名称、歌手名称。有播放 / 暂停按钮、上一首、下一首按钮。进度条显示播放进度&#xff0c;可以拖动进度条调整播放位置。音量调节滑块。 歌曲列表页面&#xff1a; 展示歌曲列表&#xff0c;包括歌曲名称、…...

OceanBase 4.x 部署实践:如何从单机扩展至分布式部署

OceanBase 4.x 版本支持2种部署模式&#xff1a;单机部署与分布式部署&#xff0c;同时支持从单机平滑扩展至分布式架构。这样&#xff0c;可以有效解决小型业务向大型业务转型时面临的扩展难题&#xff0c;降低了机器资源的成本。 以下将详述如何通过命令行&#xff0c;实现集…...

大数据新视界 --大数据大厂之TeZ 大数据计算框架实战:高效处理大规模数据

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...

docker详解介绍+基础操作 (三)

1.docker 存储引擎 Overlay&#xff1a; 一种Union FS文件系统&#xff0c;Linux 内核3.18后支持 Overlay2&#xff1a;Overlay的升级版&#xff0c;docker的默认存储引擎&#xff0c;需要磁盘分区支持d-type功能&#xff0c;因此需要系统磁盘的额外支持。 关于 d-type 传送…...

【大语言模型-论文精读】谷歌-BERT:用于语言理解的预训练深度双向Transformers

【大语言模型-论文精读】谷歌-BERT&#xff1a;用于语言理解的预训练深度双向Transformers 目录 文章目录 【大语言模型-论文精读】谷歌-BERT&#xff1a;用于语言理解的预训练深度双向Transformers目录0. 引言1. 简介2 相关工作2.1 基于特征的无监督方法2.2 无监督微调方法2.3…...

【Java】集合中单列集合详解(一):Collection与List

目录 引言 一、Collection接口 1.1 主要方法 1.1.1 添加元素 1.1.2 删除元素 1.1.3 清空元素 1.1.4 判断元素是否存在 1.1.5 判断是否为空 1.1.6 求取元素个数 1.2 遍历方法 1.2.1 迭代器遍历 1.2.2 增强for遍历 1.2.3 Lambda表达式遍历 1.2.4 应用场景 二、…...

【Fine-Tuning】大模型微调理论及方法, PytorchHuggingFace微调实战

Fine-Tuning: 大模型微调理论及方法, Pytorch&HuggingFace微调实战 文章目录 Fine-Tuning: 大模型微调理论及方法, Pytorch&HuggingFace微调实战1. 什么是微调(1) 为什么要进行微调(2) 经典简单例子&#xff1a;情感分析任务背景微调 (3) 为什么微调work, 理论解释下 2…...

清华系“仓颉”来袭:图形起源:用AI颠覆字体设计,推动大模型商业化落地

大模型如何落地&#xff1f;又该如何实现商业化&#xff1f;这一议题已成为今年科技领域的焦点话题。 在一个鲜为人知的字体设计赛道上&#xff0c;清华创业公司“图形起源”悄然实现了商业变现&#xff1a;他们帮助字体公司将成本降低了80%&#xff0c;生产速度提升了10倍以上…...

分布式一致性协议的深度解析:Paxos与Raft

分布式系统的复杂性源于节点失效、网络分区、消息丢失等诸多不确定性。在这种背景下&#xff0c;分布式一致性问题应运而生&#xff0c;成为解决这些问题的核心。本文将从理论到实践&#xff0c;深入探讨两种经典的一致性协议&#xff1a;Paxos与Raft。文章适合有一定分布式系统…...

ai写作,五款软件助你快速写作!

在这个信息爆炸的时代&#xff0c;内容创作成为了连接用户、传递价值的桥梁。然而&#xff0c;面对日益增长的创作需求&#xff0c;如何在保证质量的同时提升效率&#xff0c;成为了每位创作者面临的难题。幸运的是&#xff0c;随着人工智能技术的飞速发展&#xff0c;AI写作软…...

解决JavaScript 数学运算精度丢失的问题

JavaScript 中执行浮点数运算时可能会遇到精度丢失的问题。这通常是因为浮点数的表示遵循IEEE 754标准&#xff0c;而这种表示法只能精确地表示有限的数字。对于大多数程序员来说&#xff0c;这不是一个问题&#xff0c;因为它允许计算机处理超出精度范围之外的数字。然而&…...

mysql学习教程,从入门到精通,SQL窗口函数(38)

1、SQL窗口函数 SQL窗口函数&#xff08;Window Functions&#xff09;是一种强大的数据分析工具&#xff0c;它们允许你在结果集的行上执行计算&#xff0c;而不需要将这些行分组到单独的输出行中。窗口函数通常与OVER()子句一起使用&#xff0c;该子句定义了窗口或分区&…...

gbase8s数据库实现黑白名单的几种方案

1、借用操作系统的黑白名单 2、使用数据库 TRUSTED CONTEXT 机制 CREATE TRUSTED CONTEXT tcx1USER rootATTRIBUTES (ADDRESS 172.16.39.162)ATTRIBUTES (ADDRESS 172.16.39.163)ENABLEWITH USE FOR wangyx WITHOUT AUTHENTICATION; 如上创建 可信任上下文对象 tcx1 在 jdb…...

Qt-窗口布局按钮输入类

1. 窗口布局 Qt 提供了很多摆放控件的辅助工具&#xff08;又称布局管理器或者布局控件&#xff09;&#xff0c;它们可以完成两件事&#xff1a; 自动调整控件的位置&#xff0c;包括控件之间的间距、对齐等&#xff1b; 当用户调整窗口大小时&#xff0c;位于布局管理器内的…...

Apache DolphinScheduler社区9月进展记录

各位热爱 Apache DolphinScheduler 的小伙伴们&#xff0c;社区 9 月月报更新啦&#xff01;这里将记录 Apache DolphinScheduler 社区每月的重要更新&#xff0c;欢迎关注&#xff01; 月度 Merge Star 感谢以下小伙伴上个月为 Apache DolphinScheduler 做的精彩贡献&#x…...

在docker中安装并运行mysql8.0.31

第一步&#xff1a;命令行拉取mysql镜像 docker pull mysql:8.0.31查看是否拉取成功 docker images mysql:latest第二步&#xff1a;运行mysql镜像&#xff0c;启动mysql实例 docker run -p 3307:3307 -e MYSQL_ROOT_PASSWORD"123456" -d mysql:8.0.313307:3307前…...

C++ | Leetcode C++题解之第458题可怜的小猪

题目&#xff1a; 题解&#xff1a; class Solution { public:int poorPigs(int buckets, int minutesToDie, int minutesToTest) {if (buckets 1) {return 0;}vector<vector<int>> combinations(buckets 1,vector<int>(buckets 1));combinations[0][0] …...

【万字长文】Word2Vec计算详解(三)分层Softmax与负采样

【万字长文】Word2Vec计算详解&#xff08;三&#xff09;分层Softmax与负采样 写在前面 第三部分介绍Word2Vec模型的两种优化方案。 【万字长文】Word2Vec计算详解&#xff08;一&#xff09;CBOW模型 markdown行 9000 【万字长文】Word2Vec计算详解&#xff08;二&#xff0…...

Java调用动态库总崩溃?从SIGSEGV日志反向定位到C端ABI兼容性缺陷——一线故障复盘(含GDB+Java Core联合调试全流程)

第一章&#xff1a;Java调用动态库总崩溃&#xff1f;从SIGSEGV日志反向定位到C端ABI兼容性缺陷——一线故障复盘&#xff08;含GDBJava Core联合调试全流程&#xff09;某金融风控系统在JDK 17 Alpine Linux&#xff08;musl libc&#xff09;环境下频繁触发 JVM Crash&#…...

C++ 性能评测工程:基于 Google Benchmark 的 C++ 函数级性能基准测试方法论

各位技术同仁&#xff0c;下午好&#xff01;今天&#xff0c;我们将深入探讨一个在C开发中至关重要的话题&#xff1a;C 函数级性能基准测试。尤其是在追求极致性能的C世界里&#xff0c;仅仅依靠经验和直觉来优化代码是远远不够的。我们需要一套科学、严谨的方法论来量化和评…...

AI营销SaaS榜单评测:原圈科技如何助力品牌客户破局增长?

本文深度探讨AI营销行业趋势与SaaS产品评选标准。在众多解决方案中&#xff0c;原圈科技的AI营销SaaS平台凭借其领先的技术底层能力、产品成熟度及客户成功案例&#xff0c;在市场适配度与服务落地性等多个维度下表现突出&#xff0c;被普遍视为企业实现精细化营销升级的有力选…...

KT0803K FM发射芯片Arduino驱动开发与射频工程实践

1. KT0803系列FM发射芯片Arduino库深度解析与工程实践指南1.1 芯片定位与系统级约束KT0803及其衍生型号&#xff08;KT0803K/L/M&#xff09;是高度集成的单芯片FM广播发射器&#xff0c;专为低功耗、小体积音频广播应用设计。该系列芯片内部集成了PLL频率合成器、立体声编码器…...

Seeed rpcBLE库:RTL8720DN平台的Arduino兼容BLE开发方案

1. 项目概述 Seeed Arduino rpcBLE 是一款面向嵌入式开发者的轻量级蓝牙低功耗&#xff08;BLE&#xff09;软件库&#xff0c;专为基于 Realtek RTL8720DN SoC 的 Seeed Studio 开发板&#xff08;如 Wio Terminal、Wio-E5、W600 系列&#xff09;设计。该库并非从零实现 BLE…...

C++ 地址空间随机化(ASLR):探讨 C++ 动态链接库在内存布局上的安全特性

尊敬的各位同仁&#xff0c;各位对系统安全和C编程充满热情的开发者们&#xff0c;大家下午好&#xff01;今天&#xff0c;我们齐聚一堂&#xff0c;共同探讨一个在现代软件安全领域至关重要的主题——地址空间布局随机化&#xff08;ASLR&#xff09;&#xff0c;特别是它如何…...

【深度剖析】从libgomp TLS内存分配冲突到scikit-learn在ARM平台的兼容性优化

1. ARM架构下TLS内存分配的底层原理 当你在ARM服务器上跑scikit-learn模型时&#xff0c;突然蹦出"cannot allocate memory in static TLS block"错误&#xff0c;这背后其实是线程本地存储&#xff08;TLS&#xff09;在作祟。想象每个线程都有自己专属的储物柜&…...

效率提升秘籍:使用快马AI一键生成动漫视频批量处理与格式转换工具

效率提升秘籍&#xff1a;使用快马AI一键生成动漫视频批量处理与格式转换工具 最近接手了一个动漫视频处理的项目&#xff0c;需要将大量不同格式的动漫视频统一转换为高清MP4格式&#xff0c;并生成预览缩略图。手动处理不仅耗时耗力&#xff0c;还容易出错。于是我开始寻找自…...

避坑指南:Windows系统下WampServer2.2e与MySQL5.5.24的完美兼容配置

避坑指南&#xff1a;Windows系统下WampServer2.2e与MySQL5.5.24的完美兼容配置 在本地开发环境中&#xff0c;WampServer因其便捷的一键式部署深受开发者喜爱。但当系统已存在其他MySQL服务时&#xff0c;端口冲突问题往往让新手束手无策。本文将深入解决WampServer2.2e与既有…...

经典35kW V型磁钢永磁同步电机设计:基于Maxwell的成熟方案解析

基于Maxwell设计的 经典35kW&#xff0c;外径290 轴向长度88 3000RPM&#xff0c;111.5Nm, 6极36槽永磁同步电机&#xff08;PMSM&#xff09;设计案例(V型磁钢)&#xff0c;该案例已制作样机&#xff0c;方案成熟&#xff0c;运行稳定&#xff0c;可直接用于生产&#xff0c…...