Android Preference简单介绍

Android Preference简单介绍

文章目录

  • Android Preference简单介绍
    • 一、前言
    • 二、Preference 简单介绍
    • 二、PreferenceScreen和SwitchPreference 简单示例
      • 2、相关demo代码示例
        • (1)SettingsActivity.Java
        • (2)layout\settings_activity.xml
        • (3)xml\root_preferences.xml
        • (4)build.gradle
        • (5)示例demo效果:
    • 三、相关内容
      • 1、Android的Preference小结
        • (1)主要的Preference组件包括:
        • (2)与Android Preference相关的开发内容:
        • (3)`Preference` 标签属性及其含义
      • 2、Preference 其他内容,自行研究部分
        • (1)PreferenceCategory
        • (2)settingslib自定义类:PrimarySwitchPreference
        • (3)settingslib自定义类:AddPreference
        • (4)settingslib自定义类:RestrictedPreference和RestrictedSwitchPreference

一、前言

想刀一个人的心是藏不住的,我要吐槽一下Google工程师;

写代码就写代码,Settings代码非要写Preference那套布局.

没怎么学过Preference相关知识,之前很多次想修改获取一直Settings里面的某个功能或者布局就看得蛋疼。

PreferenceScreen、PreferenceCategory、SwitchPreference这个东西,看Settings里面的代码是一脸懵逼。

如果你把Preference相关的类和布局当成普通类,想要修改一两个文件的布局界面和具体事件,

那么你有可能两天都修改不了一个简单的UI效果和它的处理事件。

这种情况,你只要在Android Studio创建一个 Settings项目,里面就包含了Preference 的demo代码,你只要在Studio中修改运行调试代码,再把修改的代码移植到Settings代码就行了。

Android 原生Settings应用用到了大量的Preference显示界面和处理相应是事件,

如果要修改Settings界面了解Preference是非常必要的。

本文带大家伙一起简单入门一下Android Preference的简单使用。

二、Preference 简单介绍

  • Android Preference 是一种可以在Android应用程序中使用的预设用户界面组件,

    用于在应用程序中提供一致且易于使用的界面,用于设置和配置应用程序的各个部分。

  • Android Preference提供了几种不同类型的偏好设置,包括复选框、单选按钮、开关和滑块等。

    这些偏好设置可以轻松添加到应用程序的用户界面中,并可以使用Android提供的预设样式和布局进行自定义。
    要在Android应用程序中使用Preference,您需要在应用程序的XML资源文件中定义每个偏好设置的首选项元素。

    每个首选项元素都具有唯一的键和显示给用户的值。

    当用户更改任何偏好设置时,Android会自动保存更改,并在用户下次启动应用程序时恢复它们。

Android SharePreference 可以保存配置文件到apk数据目录下的xml文件中。

Android Preference 和 SharePreference 的关系在于,当用户通过 Android Preference 用户界面更改设置时,这些更改会保存在 SharePreference 中。

Android Preference 使用 SharePreference 存储和检索每个设置的值。

当用户再次打开应用程序时,Android Preference 会从 SharePreference 中检索先前保存的设置值,并相应地更新用户界面。

简单的说Android的Preference就是一个组件或者一个框架,它能自动记忆某个开关按钮的状态,

比如不加任何Java代码控制的情况,写一个SwitchPreference开关,开关状态改变后后,

退出应用,下次打开应用就会显示上次应用关闭前的开关的状态。

Android Preference 对于 Android 应用程序的开发具有重要的意义,

因为它提供了一种创建一致且易于使用的设置界面的便捷方式。

通过使用 Android Preference,开发人员可以快速为应用程序

的不同设置和配置创建一个熟悉的用户界面,而无需从头开始编写自定义代码。

二、PreferenceScreen和SwitchPreference 简单示例

1、在Android Studio创建一个Preference项目

Android Studio -->File -->New -->new Project -->Settings Activity

如下图所示:

在这里插入图片描述

创建好的项目就会有一个xml文件,这个文件专门就是放Preference布局的文件。

2、相关demo代码示例

这个是Android Studio 创建的Settings 类型应用代码,里面就包含了一个Java文件,调试运行很方便。

并且手动添加了一个 SwitchPreference开关,在Java代码里面添加了监听事件。

具体代码如下:

(1)SettingsActivity.Java
package com.demo.settings;import android.os.Bundle;
import android.provider.Settings;
import android.util.Log;
import android.view.View;import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.preference.Preference;
import androidx.preference.PreferenceFragmentCompat;
import androidx.preference.SwitchPreference;public class SettingsActivity extends AppCompatActivity {private static final String TAG = "SettingsActivity";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.settings_activity);if (savedInstanceState == null) {getSupportFragmentManager().beginTransaction().replace(R.id.settings, new SettingsFragment()).commit();}}public static class SettingsFragment extends PreferenceFragmentCompat {@Overridepublic void onCreatePreferences(Bundle savedInstanceState, String rootKey) {setPreferencesFromResource(R.xml.root_preferences, rootKey);//监听switch开关的状态SwitchPreference  switchPreference = (SwitchPreference) findPreference("ethernet_turn_off");switchPreference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {@Overridepublic boolean onPreferenceChange(Preference preference, Object newValue) {boolean isCheck = (boolean) newValue;Log.i(TAG, "onPreferenceChange preference = " + preference + ", isCheck = " + isCheck);return true;}});switchPreference.setSummary("IP:XXX");//副标题,在标题下方,也可以设置空字符串}}
}

这里可以看到是使用了一个Preference相关的Fragment放置布局显示。

之前的layout布局要么不用,要么用来放Preference对应的的Fragment。
其实我研究Preference 就是为了添加一个开关:SwitchPreference

(2)layout\settings_activity.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><FrameLayoutandroid:id="@+id/settings"android:layout_width="match_parent"android:layout_height="match_parent" />
</LinearLayout>
(3)xml\root_preferences.xml
<PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto"><PreferenceCategory app:title="@string/messages_header"><EditTextPreferenceapp:key="signature"app:title="@string/signature_title"app:useSimpleSummaryProvider="true" /><ListPreferenceapp:defaultValue="reply"app:entries="@array/reply_entries"app:entryValues="@array/reply_values"app:key="reply"app:title="@string/reply_title"app:useSimpleSummaryProvider="true" /></PreferenceCategory><PreferenceCategory app:title="@string/sync_header"><SwitchPreferenceCompatapp:key="sync"app:title="@string/sync_title" /><SwitchPreferenceCompatapp:dependency="sync"app:key="attachment"app:summaryOff="@string/attachment_summary_off"app:summaryOn="@string/attachment_summary_on"app:title="@string/attachment_title" /></PreferenceCategory><SwitchPreferenceapp:key="ethernet_turn_off"app:title="ethernet_turn_off"app:summary="ethernet info"/></PreferenceScreen>
(4)build.gradle
dependencies {implementation 'androidx.appcompat:appcompat:1.1.0'implementation 'com.google.android.material:material:1.1.0'implementation 'androidx.preference:preference:1.1.1' //Preference的依赖包
}

关键就是要依赖preference的包。

Android 系统源码中Android.bp填入的包:

    static_libs: ["androidx-constraintlayout_constraintlayout","androidx.preference_preference", //Preference的依赖包...],
(5)示例demo效果:

在这里插入图片描述

上面demo代码使用到的控件简单介绍:

PreferenceScreen:xml布局界面的根属性

PreferenceCategory:类似layout里面的LinearLayout

EditTextPreference :输入框组件,只在布局文件里面定义,点击条目就可以弹框输入内容,确认后显示在点击的条目上;

ListPreference:列表选择组件,只在布局文件里面定义,点击条目就可以弹框列表内容,确认后显示在点击的条目上;

SwitchPreference: 提供开关按钮功能的组件

SwitchPreferenceCompat: 提供开关按钮功能的组件,是后来随AndroidX Preference库引入的;

SwitchPreference和SwitchPreferenceCompat用法是完全一样的,最新的Preference库也是包含SwitchPreference的;

对于Android新版本比如Android13,SwitchPreferenceCompat兼容性会好一点。

示例demo只是演示效果,很多其他相关的组件可以自己调试研究。

三、相关内容

1、Android的Preference小结

  • Android的Preference是一组预设的UI组件,可以让开发者轻松地在应用程序中实现设置界面。
  • 它包括各种类型的设置项,如开关、滑动条、单选按钮等。
(1)主要的Preference组件包括:
(1) PreferenceScreen:根节点,代表一个偏好设置的屏幕。它是其他Preference组件的容器。
(2) EditTextPreference:允许用户输入文本值的偏好设置。
(3) CheckBoxPreference(在新版中被`SwitchPreferenceCompat`替代):提供一个开关按钮供用户开启或关闭某个设置。
(4) SwitchPreferenceCompat:与CheckBoxPreference功能类似,提供一个滑动开关供用户切换设置。
(5) ListPreference:显示一个选择列表,用户可以从中选择一个选项作为设置。
(6) MultiSelectListPreference:允许用户从列表中选择多个选项。
(7) PreferenceCategory:用于将偏好设置分组的类别标题。
(8) PreferenceFragmentCompat:一个Fragment,用于在其内部显示一个偏好设置的屏幕。
(2)与Android Preference相关的开发内容:
1. 使用PreferenceFragment实现设置界面:PreferenceFragment是Android支持库中提供的一种用于实现设置界面的Fragment。通过继承PreferenceFragment类并重写onCreatePreferences方法,可以轻松地创建设置界面。2. 使用PreferenceScreen配置设置项:PreferenceScreen是AndroidManifest.xml文件中的一个元素,用于配置应用程序的设置项。通过在PreferenceScreen元素中添加不同的元素,可以实现不同类型的设置项。3. 使用SharedPreferences存储设置数据:SharedPreferences是Android中提供的一种轻量级的存储方式,用于存储应用程序的设置数据。通过调用PreferenceFragment类中的getSharedPreferences方法,可以获取到SharedPreferences对象,并通过编辑器进行数据的读写操作。4. 使用Preference.OnPreferenceClickListener监听设置项点击事件:通过为设置项设置OnPreferenceClickListener监听器,可以在用户点击设置项时执行相应的操作。5. 使用Preference.OnPreferenceChangeListener监听设置项变化事件:通过为设置项设置OnPreferenceChangeListener监听器,可以在用户修改设置项的值时执行相应的操作。总之,Android的Preference为开发者提供了一种方便快捷的方式来实现应用程序的设置界面,通过组合不同的元素和监听器,可以实现丰富的设置项功能。
(3)Preference 标签属性及其含义

在Android开发中,Preference 是用于构建设置界面的一种简便方法。

它允许开发者以声明式的方式在XML文件中定义设置项,而不是手动创建UI。

每个 Preference 标签代表一个设置项,并且有多种属性来定义其行为和外观。

比如下面这个 PreferenceCategory 包含了很多标签属性:

<PreferenceCategoryandroid:key="multi_network_header"android:title="@string/summary_placeholder"android:layout="@layout/preference_category_no_label"settings:allowDividerBelow="true"android:order="-40"settings:controller="com.android.settings.network.MultiNetworkHeaderController"/>

每个Preference 条目都有一些属性,那么这些属性的含义是什么呢?

以下是一些常见的 Preference 标签属性及其含义:

1. key: 这个属性定义了偏好设置的唯一标识符。通过这个键,你可以在代码中检索或更新偏好设置的值。
2. title: 设置项的标题,这是用户在设置界面看到的文本。
3. summary: 设置项的摘要或描述,显示在标题下方,用于提供更多关于设置项的信息。
4. defaultValue: 定义设置项的默认值。当应用第一次运行,且用户尚未更改过该设置时,将使用此默认值。
5. widgetLayout: 允许开发者为偏好设置项指定一个自定义的布局。
6. dependency: 这个属性使当前偏好设置依赖于另一个偏好设置的值。
例如,如果一个偏好设置项被禁用,直到另一个特定的偏好设置被激活/选中。
7. enabled: 控制偏好设置是否可用。默认为 true,即默认情况下是启用状态。
8. selectable: 控制偏好设置项是否可以被选中。默认为 true。
9. icon: 给设置项指定一个图标,以增加可识别性。
10. fragment: 指定当偏好设置被选中时,应该启动的Fragment的全名。这对于构建多层次的设置界面很有用。

上面只是一些主要标签属性,不同的组件还有不同的标签属性。

上面只是介绍了 Preference 的一些简单知识,入门是没有问题的;

但是狗歌开发的Settings会那么简单吗?

Preference相关组件除了Androidx的包定义那些类,

在Settings应用里面还用到了一些的SettingsLib包中自定义的Preference组件,如需要的请自行研究的。

2、Preference 其他内容,自行研究部分

下面都是 network_and_internet.xml里面定义的一些 Preference

package\app\Settings\res\xml\network_and_internet.xml

(1)PreferenceCategory
 <PreferenceCategoryandroid:key="multi_network_header"android:title="@string/summary_placeholder"android:layout="@layout/preference_category_no_label"settings:allowDividerBelow="true"android:order="-40"settings:controller="com.android.settings.network.MultiNetworkHeaderController"/>

PreferenceCategory 加 settings :controller是上面意思?

(2)settingslib自定义类:PrimarySwitchPreference
    <com.android.settingslib.PrimarySwitchPreferenceandroid:fragment="com.android.settings.wifi.WifiSettings"android:key="main_toggle_wifi"android:title="@string/wifi_settings"android:summary="@string/summary_placeholder"android:icon="@drawable/ic_settings_wireless"android:order="-30"settings:allowDividerAbove="true"><intentandroid:action="android.settings.WIFI_SETTINGS"android:targetClass="Settings$WifiSettingsActivity" /></com.android.settingslib.PrimarySwitchPreference>

settingslib包自定义的类,应该是一开关功能的类,添加intent 又是啥操作?

(3)settingslib自定义类:AddPreference
    <com.android.settings.widget.AddPreferenceandroid:key="mobile_network_list"android:title="@string/network_settings_title"android:summary="@string/summary_placeholder"android:icon="@drawable/ic_network_cell"android:order="-15"settings:keywords="@string/keywords_more_mobile_networks"settings:userRestriction="no_config_mobile_networks"settings:useAdminDisabledSummary="true" />

这个是Settings里面自定义的Preference,具体效果和功能要看实现类里面。

(4)settingslib自定义类:RestrictedPreference和RestrictedSwitchPreference
    <com.android.settingslib.RestrictedSwitchPreferenceandroid:key="airplane_mode"android:title="@string/airplane_mode"android:icon="@drawable/ic_airplanemode_active"android:disableDependentsState="true"android:order="-5"        settings:controller="com.android.settings.network.AirplaneModePreferenceController"settings:userRestriction="no_airplane_mode"/><com.android.settingslib.RestrictedPreferenceandroid:key="manage_mobile_plan"android:title="@string/manage_mobile_plan_title"android:persistent="false"android:order="19"settings:userRestriction="no_config_mobile_networks"settings:useAdminDisabledSummary="true" />

settingslib总共大概有十个左右的自定义类。有用到的可以自己看看。

Android SettingsLib代码位置:

framework\base\packages\SettingsLib\src\com\android\settingslib

在线查看源码网址目录:

http://aospxref.com/android-13.0.0_r3/xref/frameworks/base/packages/SettingsLib/src/com/android/settingslib/

具体某个文件:

http://aospxref.com/android-13.0.0_r3/xref/frameworks/base/packages/SettingsLib/src/com/android/settingslib/RestrictedPreference.java

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

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

相关文章

Qt学习笔记(一)——Qt初识

本文仅是 学习时记录的笔记&#xff0c;供自己复习时使用。 1.创建好文件(QWidget窗口) main.cpp中&#xff1a; 注&#xff1a;Widget类继承父类QWidget. widget.h中&#xff1a; Widget.cpp中&#xff1a; 打开Forms文件夹中的widget.ui文件&#xff1a; 打开左边编辑&am…

【吊打面试官系列】Redis篇 - 为什么 redis 需要把所有数据放到内存中?

大家好&#xff0c;我是锋哥。今天分享关于 为什么 redis 需要把所有数据放到内存中 面试题&#xff0c;希望对大家有帮助&#xff1b; Redis 为了达到最快的读写速度将数据都读到内存中&#xff0c;并通过异步的方式将数 据写入磁盘。所以 redis 具有快速和数据持久化的特征。…

飞腾+FPGA+AI电力行业智能数据采集与分析网闸解决方案

行业痛点: 安全物联网闸在监控平台中的具体作用&#xff1a;35KV变电站是煤矿的动力核心&#xff0c;采矿人员上下井、煤炭提升输送、矿井通风等核心设备均依靠变电站提供电源。监控中心及时掌握变电站的运行状态对煤矿的安全生产非常重要。如若外部通过监控网络来控制变电站会…

Python爬虫入门:HTTP与URL基础解析及简单示例实践

在数字化时代&#xff0c;数据已成为一种宝贵的资源。Python作为一种强大的编程语言&#xff0c;在数据采集和处理方面表现出色。爬虫技术&#xff0c;即网络爬虫&#xff0c;是Python中用于数据采集的重要工具。本文作为Python爬虫基础教程的第一篇&#xff0c;将深入讲解URL和…

流畅的 Python 第二版(GPT 重译)(六)

第三部分&#xff1a;类和协议 第十一章&#xff1a;一个 Python 风格的对象 使库或框架成为 Pythonic 是为了让 Python 程序员尽可能轻松和自然地学会如何执行任务。 Python 和 JavaScript 框架的创造者 Martijn Faassen。 由于 Python 数据模型&#xff0c;您定义的类型可以…

CSS3新属性(学习笔记)

一、. 圆角 border-radius:; 可以取1-4个值&#xff08;规则同margin&#xff09; 可以取px和% 一般用像素&#xff0c;画圆的时候用百分比&#xff1a;border-radius:50%; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8&q…

【鸿蒙HarmonyOS开发笔记】通知模块之发布进度条类型通知

概述 进度条通知也是常见的通知类型&#xff0c;主要应用于文件下载、事务处理进度显示。HarmonyOS提供了进度条模板&#xff0c;发布通知应用设置好进度条模板的属性值&#xff0c;如模板名、模板数据&#xff0c;通过通知子系统发送到通知栏显示。 目前系统模板仅支持进度条…

Svg Flow Editor 原生svg流程图编辑器(三)

系列文章 Svg Flow Editor 原生svg流程图编辑器&#xff08;一&#xff09; Svg Flow Editor 原生svg流程图编辑器&#xff08;二&#xff09; Svg Flow Editor 原生svg流程图编辑器&#xff08;三&#xff09; 实现对齐辅助线 在 logicFlow 中&#xff0c;辅助线的实现是通…

【网页实战项目设计】基于SSM的高校二手交易平台 (大学跳蚤市场)(源码+LW文档)

基于SSM的高校二手交易平台 &#xff08;大学跳蚤市场&#xff09; 项目截图 系统功能界面图 用户注册、用户登录界面图 个人中心界面图 商品信息界面图 商品上架管理界面图 订单信息管理界面图 开发环境与技术框架 开发语言&#xff1a;Java 框架&#…

SV-7035VP播放模块通用型播放终端SV-7035VP-SIP 网络通用型播放功放模块

SV-7035VP播放模块通用型播放终端SV-7035VP-SIP 网络通用型播放功放模块 产品介绍 SV-7035VP模块是一款SIP播放模块&#xff0c;具有10/100M以太网接口&#xff0c;其接收网络的音频数据&#xff0c;提供立体声的音频输出。 本SIP播放模块带有一个继电器端子和一个NET接口&a…

RabbitMQ-同步和异步区别快速入门

文章目录 1.1.同步和异步通讯1.1.1.同步通讯1.1.2.异步通讯 1.2.技术对比&#xff1a; 2.快速入门2.1.安装RabbitMQ2.2.RabbitMQ消息模型2.3.入门案例2.3.1.publisher实现 1.1.同步和异步通讯 服务间通讯有同步和异步两种方式&#xff1a; 同步通讯&#xff1a;就像打电话&am…

Simulink如何自动保存模型,解决崩溃问题

文章目录 Simulink如何自动保存模型,解决崩溃问题自动保存模型脚本脚本使用方法专题目录 Simulink如何自动保存模型,解决崩溃问题 自动保存模型脚本 在使用sumilink建模中,暂无自动保存模型的相关设置,使用中常常会遇到软件卡死奔溃现象 当出现如上提示,如果花费了半天建…

在抖音电商迎上新趋势,他们找到春季服饰生意新增量

冬去春来&#xff0c;万物焕新。每年春天换季的时候&#xff0c;都是大家买新衣服的高峰期。 对于服饰商家来说&#xff0c;季节性的平台活动&#xff0c;能够带来较大的消费需求扩容空间&#xff0c;也是推动生意增长的好时机。在3月9日-3月14日举办的「抖音商城服饰焕新周」…

FreeCAD傻瓜教程之创建参数化几何图形-螺旋体、平面、球体、椭球体、圆柱体、圆锥体、棱柱、椭圆

目的&#xff1a;学会用FreeCAD绘制参数化的几何图形。 一、使用的工作台和工具 1.1选择Part 工作台 1.2单击创建图元...工具 也就是上图黄色工具区域的倒数第2个 1.3 打开几何图元 下方的下拉列表 二、绘制螺旋体、弹簧、螺丝杆 2.1 选择几何图元列表中的 “螺旋体” 设…

Mysql主从之keepalive+MySQL高可用

一、Keepalived概述 keepalived 是集群管理中保证集群高可用的一个服务软件&#xff0c;用来防止单点故障。 keepalived 是以VRRP 协议为实现基础的&#xff0c;VRRP 全称VirtualRouter Redundancy Protocol&#xff0c;即虚拟路由冗余协议。虚拟路由冗余协议&#xff0c;可以…

武汉星起航领航中国跨境电商,助推全球贸易新篇章

在全球经济一体化的浪潮中&#xff0c;跨境电商以其独特的优势成为推动国际贸易增长的重要引擎。作为中国跨境电商行业的领军者&#xff0c;武汉星起航电子商务有限公司以其卓越的能力和经验&#xff0c;正积极推动中国跨境电商走向世界&#xff0c;书写全球贸易的新篇章。 自…

leetcode 18.四数之和 java

题目 思路 整体在三数之和的基础上进行修改。&#xff08;所有需要修改的地方&#xff0c;我在代码里加了//改 的注释&#xff09; 大的一个思路就是&#xff0c;在三数之和的外面再套一层循环。相当于固定前两个数。然后这道题目标值变成一个参数了&#xff0c;不是三数之和…

termux安装

termux安装Python和postgres 安装python 安装pg数据库

语音神经科学—05. Human cortical encoding of pitch in tonal and non-tonal languages

Human cortical encoding of pitch in tonal and non-tonal languages&#xff08;在音调语音和非音调语言中人类大脑皮层的音高编码&#xff09; 专业术语 tonal language 音调语言 pitch 音高 lexical tone 词汇音调 anatomical properties 解刨学特性 temporal lobe 颞叶 s…

基于Java的桃花峪滑雪场租赁系统(Vue.js+SpringBoot)

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 游客服务2.2 雪场管理 三、数据库设计3.1 教练表3.2 教练聘请表3.3 押金规则表3.4 器材表3.5 滑雪场表3.7 售票表3.8 器材损坏表 四、系统展示五、核心代码5.1 查询教练5.2 教练聘请5.3 查询滑雪场5.4 滑雪场预定5.5 新…