Android Preference的使用以及解析

news2024/10/9 13:50:06

简单使用

  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">
    <Preference
        android:key="simple_preference"
        android:summary="This is a simple preference"
        android:title="Simple Preference" />
    <CheckBoxPreference
        android:defaultValue="false"
        android:key="checkbox_preference"
        android:summary="This is a CheckBox"
        android:title="Check Box Preference" />
    <EditTextPreference
        android:dialogTitle="Enter Text"
        android:key="edittext_preference"
        android:summary="Enter your text here"
        android:title="Edit Text Preference" />
    <ListPreference
        android: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.CustomSeekBarPreference
        android: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 = this
        findPreference?.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.Preference

import 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.R

class 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.Preference


import 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.R

class CustomSeekBarPreference(context: Context, attrs: AttributeSet) : Preference(context, attrs) {

    private var currentValue: Int = 0
    private var maxValue: Int = 100

    init {
        widgetLayoutResource = R.layout.preference_seekbar
    }

    override fun onBindViewHolder(holder: PreferenceViewHolder) {
        super.onBindViewHolder(holder)
        val seekBar = holder.findViewById(R.id.seekbar) as SeekBar
        val valueText = holder.findViewById(R.id.seekbar_value) as TextView

        seekBar.max = maxValue
        seekBar.progress = currentValue

        valueText.text = currentValue.toString()

        seekBar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {
            override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
                currentValue = progress
                valueText.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的值相同。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2199172.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【权威出版|稳定检索】2024年信息学、网络与计算机应用技术国际会议(INCAT 2024)

2024 International Conference on Informatics, Networking, and Computer Application Technology 【1】大会信息 会议名称&#xff1a;2024年信息学、网络与计算机应用技术国际会议 会议简称&#xff1a;INCAT 2024 大会时间&#xff1a;请查看官网 大会地点&#xff1a;中…

携程酒店含价格全国城市分析1

在做一些城市分析、学术研究分析、商业选址、商业布局分析、住宿业分析等数据分析挖掘时&#xff0c;携程酒店的数据参考价值非常大&#xff0c;可以从酒店档次、分布、价格、特色服务等多维度来分析研究。 具体分析研究的字段维度包括酒店名、星级、星级类型、酒店标签、酒店…

通过GIS数据对比北京西城区和鹤岗工农区,数据解释为啥房价差异那么大

这两个区域都是所在城市的核心区域&#xff0c;而且北京西城区是老城区。面积不像其它区域那么大&#xff0c;所以对比起来有一定的代表性&#xff01;我从医疗机构和企业单位两方面进行了对比&#xff0c;他们分别可以代表我们的生活和就业&#xff01;当然我也想对学校教育对…

期权懂|期权中的看涨期权与看跌期权是什么意思?

本期让我懂 你就懂的期权懂带大家来了解&#xff0c;期权中的看涨期权与看跌期权是什么意思&#xff1f;有兴趣的朋友可以看一下。期权小懂每日分享期权知识&#xff0c;帮助期权新手及时有效地掌握即市趋势与新资讯&#xff01; 期权中的看涨期权与看跌期权是什么意思&#xf…

sql-lab打不开网页了(没解决)

早上起来想打开sql-lab&#xff0c;发现变成这样了&#xff0c;昨天好像是因为aws&#xff0c;打开了一些服务&#xff0c;那我也没关闭一些服务吧.. 服务正常开启 也有mysql服务 尝试重启服务&#xff0c;发现问题&#xff0c;ok啊&#xff0c;还是很简单的&#xff0c;提示有…

Transformer宝藏入门教程,五天肝疯了—Transformer最全面的入门指南

前言 随着 BERT、GPT 等大规模语言模型的兴起&#xff0c;越来越多的公司和研究者采用 Transformers 库来构建 NLP 应用。本文档教程里包括了自然语言处理、Transformer模型、注意力机制、pytorch、微调预训练模型、翻译任务、序列标注任务、文本摘要等等模块 一、内容介绍 …

JVM篇(学习预热 - 云原生时代的JVM(GraalVM))(持续更新迭代)

目录 一、GraalVM是什么&#xff1f; 二、GraalVM有哪些特点&#xff1f; 1. 高性能 2. 多语言支持 3. 互操作性 4. 安全性 三、GraalVM的应用效果 1. 提高性能 2. 简化开发 3. 降低成本 4. 节省资源 5. 支持云环境 四、使用GraalVM编译springboot应用程序 1. 下载…

【JAVA面试题】Java和C++主要区别有哪些?各有哪些优缺点?

文章目录 强烈推荐前言区别&#xff1a;1. 语法和编程风格2.内存管理3.平台独立性4.性能5.指针和引用6.多线程7.使用场景 Java 的优缺点优点&#xff1a;缺点&#xff1a; C 的优缺点优点&#xff1a;缺点&#xff1a; 总结专栏集锦 强烈推荐 前些天发现了一个巨牛的人工智能学…

ARMv7/v8m GCC Compilation

00-Guide01-Toolchains02-GNU binutils03-ELF file04-Compilation process05-CFLAGS options06- Linker Scripts07 -Link Options08-Map file09-Static and dynamic lib10-Secureboot and image11-Builtin functions12-Function Attributes

Prometheus + Grafana 监控 MySQL 数据库

文章目录 1、前置介绍2、搭建流程2.1、安装 Docker2.2、安装 MySQL2.3、安装 MySQL Exporter2.4、安装 Prometheus2.5、安装 Grafana 1、前置介绍 本次监控平台搭建&#xff0c;我使用2台阿里云服务器来完成本次的搭建部署操作&#xff0c;配置如下&#xff1a; 阿里云ECS1&am…

重大更新,谷歌地球倾斜摄影数据OSGB转换软件V2.0版发布

距离谷歌倾斜摄影OSGB数据V1.2版发布已三月有余&#xff0c;这三个月除了忙于对转换软件进行Bug修复和数据效果提升外&#xff0c;最重要的是解决一个比较严重的问题&#xff0c;即倾斜摄影数据中除了倾斜摄影外&#xff0c;还包含没有倾斜摄影的影像数据。从软件V0.1版免费向大…

过于可爱!手把手教你用AI绘画工具SD做人气超高的毛绒玩具,SD毛绒玩具制作教程详解!

大家好&#xff0c;我是灵魂画师向阳 最近网上看到一些用 Stable Diffusion 生成的毛绒玩具&#xff0c;非常可爱。我也尝试了一下&#xff0c;效果很不错&#xff0c;还能体验一下自己做周边设计师的快乐。 这种效果做起来其实并不难&#xff0c;基本思路还是 controlnet 控…

Pandas数据分析基础

目录标题 Pandas读取和写入数据数据读取读取csv读取excel数据输出 Pandas基础操作索引数据信息统计计算位置计算数据选择 Pandas高级操作复杂查询类型转换数据排序添加修改高级过滤数据迭代高阶函数 Pandas读取和写入数据 Pandas将数据加载到DataFrame后&#xff0c;就可以使用…

Spring Cloud Netflix Zuul 网关详解及案例示范

1. 引言 在微服务架构中&#xff0c;API 网关作为服务间通信的入口&#xff0c;扮演着重要的角色。Netflix Zuul 是一个提供动态路由、监控、安全等功能的 API 网关服务器&#xff0c;它可以为微服务系统提供统一的入口&#xff0c;简化服务间的交互。在业务系统中&#xff0c…

WebGL系列教程十一(光照原理及Blinn Phong着色模型)

快速导航&#xff08;持续更新中&#xff09; WebGL系列教程一&#xff08;开篇&#xff09; WebGL系列教程二&#xff08;环境搭建及着色器初始化&#xff09; WebGL系列教程三&#xff08;使用缓冲区绘制三角形&#xff09; WebGL系列教程四&#xff08;绘制彩色三角形&…

【Sceneform-EQR】(手势优化)通过手势事件实现在AR/VR等三维场景中的控制模型旋转、平移与缩放

在上一篇【Sceneform-EQR】&#xff08;手势控制器实现&#xff09;通过手势事件实现在AR/VR等三维场景中的控制模型旋转、平移与缩放 我们实现了通过手势控制模型节点的旋转、缩放和平移。本文将介绍如何对上一篇做的手势控制器作优化&#xff0c;从而适用于场景相机发生改变…

长芯微LSPGD1系列带气嘴DIP8封装集成表压传感器完全替代松下ADP51B62替代ADP51B62,成本更低!

描述 LSPGD1是长芯微针对家电医疗等市场推出的经过校准的表压传感器系列产品。该系列产品采用高性能信号调理芯片对MEMS压阻芯体输出进行温度和压力的校准和补偿&#xff0c;保证性能和可靠性的同时对封装进行了集成&#xff0c;易于使用。LSPGD1系列集成压力传感器可选量程为…

QT<27> Qt中编写串口通讯,例如读RFID、EKS等等

一、添加文件 ①在项目中添加C文件&#xff0c;继承自QObject ②添加必要模块以及头文件 项目pro文件添加 serialport模块 项目.h文件中添加头文件 #include <QSerialPort> #include <QSerialPortInfo> 二、具体代码 ①在.h文件中声明一个类对象 QSerialPor…

计算机网络 tcp和udp

目录 一、TCP 建立连接-TCP 三次握手 1&#xff09; 什么是半连接队列和全连接队列&#xff1f; 2&#xff09; 为什么要三次握手? 3&#xff09; 三次握手过程中可以携带数据吗&#xff1f; 断开连接-TCP 四次挥手 1&#xff09; 为什么要四次挥手&#xff1f; 2&…

PointNet++网络详解

数据集转换 数据集转换的意义在于将原本的 txt 点云文件转换为更方便运算的npy点云文件&#xff0c;同时&#xff0c;将原本的xyzrgb这 6 个维度转换为xyzrgbc&#xff0c;最后一个c维度代表该点云所属的类别。 for anno_path in anno_paths:print(anno_path)try:elements a…