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.rhkb.cn/news/284656.html

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

相关文章

局域网内的手机、平板、电脑的文件共享

在日常工作生活中&#xff0c;经常需要将文件在手机、平板、电脑间传输&#xff0c;以下介绍三种较为便捷的方法&#xff1a; 1.LocalSend 该软件是免费开源的&#xff0c;可以在局域网内的任意手机、平板、电脑间传递文件&#xff0c;并且任意一方都可以作为“发送方”和“接…

taro框架之taro-ui中AtSwipeAction的使用

题记&#xff1a;所需效果&#xff1a;滑动删除 工作进程 官网文档代码 <AtSwipeAction options{[{text: 取消,style: {backgroundColor: #6190E8}},{text: 确认,style: {backgroundColor: #FF4949}} ]}><View classNamenormal>AtSwipeAction 一般使用场景</…

DataEase大屏iframe嵌入自建网站(React)

1、修改dataease 所在的服务器nginx配置 server {listen 80;server_name dataease.ibaiqiu.cn;return 307 https://$host$request_uri; } server {listen 443 ssl;server_name dataease.ibaiqiu.cn;client_max_body_size 30M;ssl_certificate /usr/local/nginx/co…

计算机三级——网络技术(综合题第二题)

路由器工作模式 用户模式 当通过Console或Telnet方式登录到路由器时&#xff0c;只要输入的密码正确&#xff0c;路由器就直接进入了用户模式。在该模式下&#xff0c;系统提示符为一个尖括号(>)。如果用户以前为路由器输入过名称&#xff0c;则该名称将会显示在尖指号的前…

HarmonyOS应用开发实战 - Api9 拍照、拍视频、选择图片、选择视频、选择文件工具类

鸿蒙开发过程中&#xff0c;经常会进行系统调用&#xff0c;拍照、拍视频、选择图库图片、选择图库视频、选择文件。今天就给大家分享一个工具类。 1.话不多说&#xff0c;先展示样式 2.设计思路 根据官方提供的指南开发工具类&#xff0c;基础的拍照、拍视频、图库选照片、选…

分布式组件 Nacos

1.在之前的文章写过的就不用重复写。 写一些没有写过的新东西 2.细节 2.1命名空间 &#xff1a; 配置隔离 默认&#xff1a; public &#xff08;默认命名空间&#xff09;:默认新增所有的配置都在public空间下 2.1.1 开发 、测试 、生产&#xff1a;有不同的配置文件 比如…

计算联合体union的大小

一&#xff1a;联合类型的定义 联合也是一种特殊的自定义类型&#xff0c;这种类型定义的变量也包含一系列的成员&#xff0c;特征是这些成员公用同一块空间&#xff08;所以联合也叫共用体&#xff09; 比如&#xff1a;共用了 i 这个较大的空间 二&#xff1a; 联合的特点 …

【热门话题】ECMAScript vs JavaScript:理解两者间的联系与区别

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 ECMAScript vs JavaScript&#xff1a;理解两者间的联系与区别1. ECMAScript&am…

智慧工地解决方案,智慧工地项目管理系统源码,支持大屏端、PC端、手机端、平板端

智慧工地解决方案依托计算机技术、物联网、云计算、大数据、人工智能、VR&AR等技术相结合&#xff0c;为工程项目管理提供先进技术手段&#xff0c;构建工地现场智能监控和控制体系&#xff0c;弥补传统方法在监管中的缺陷&#xff0c;最线实现项目对人、机、料、法、环的全…

mysql 如何设计分库分表

在MySQL中设计分库分表的方法通常涉及到水平拆分与垂直拆分两种主要方式。 水平拆分&#xff1a; 按照某一列进行水平拆分&#xff1a; 可以根据某一列&#xff08;如用户ID、时间等&#xff09;的取值范围将数据拆分到不同的数据库或表中。基于哈希值的水平拆分&#xff1a;…

Linux 创建交换空间

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 欢迎点赞…

百度智能云+SpringBoot=AI对话【人工智能】

百度智能云SpringBootAI对话【人工智能】 前言版权推荐百度智能云SpringBootAI对话【人工智能】效果演示登录AI对话 项目结构后端开发pom和propertiessql_table和entitydao和mapperservice和implconfig和utilLoginController和ChatController 前端开发css和jslogin.html和chat.…

【xr806开发板使用】连接wifi例程实现

##开发环境 win10 WSL ##1、环境配置 参考&#xff1a;https://aijishu.com/a/1060000000287513 首先下载安装wsl 和ubuntu https://docs.microsoft.com/zh-cn/windows/wsl/install &#xff08;1&#xff09;安装repo&#xff1a; 创建repo安装目录&#xff1a; mkdir ~/…

.NET Framework 服务实现监控可观测性最佳实践

环境信息 系统环境&#xff1a;Windows Server开发语言&#xff1a;.NET Framework > 4.6.1APM探针包&#xff1a;ddtrace 准备工作 安装 Datakit 主机部署&#xff1a; 主机安装 - 观测云文档 打开采集 APM 采集器 Windows 主机配置 # 到如下路径&#xff0c;把ddtr…

sqlalchemy和moke生成实体类(一)

前言 如果通过java生成实体类&#xff0c;可以通过mybatis或者mybatis-plus的generator。 而sqlalchemy也可以生成实体类&#xff0c;通过sqlalcodegen或者flask-sqlalcodegen。 使用flask-sqlalcodegen生成实体类 建表 建立学生表&#xff0c;如下。 create table stude…

Chrome 114 带着侧边栏扩展来了

效果展示 manifest.json {"manifest_version": 3,"name": "ChatGPT学习","version": "0.0.2","description": "ChatGPT,GPT-4,Claude3,Midjourney,Stable Diffusion,AI,人工智能,AI","icons"…

linux系统------------Mysql数据库介绍、编译安装

目录 一、数据库基本概念 1.1数据(Data) 1.2表 1.3数据库 1.4数据库管理系统(DBMS) 数据库管理系统DBMS原理 1.5数据库系统&#xff08;DBS) 二、数据库发展史 1、第一代数据库 2、第二代数据库 3、第三代数据库 三、关系型数据库 3.1关系型数据库应用 3.2主流的…

Photoshop 工具使用详解(全集 · 2024版)

全面介绍 Photoshop 工具箱里的工具&#xff0c;点击下列表格中工具名称或图示&#xff0c;即可查阅工具的使用详解。 移动工具Move Tool移动选区、图层和参考线。画板工具Artboard Tool创建、移动多个画布或调整其大小。moVe快捷键&#xff1a;V 矩形选框工具 Rectangular Mar…

如何屏蔽来自一些可疑IP对网站的访问

前段时间我们的网站遭受到黑客的攻击&#xff0c;导致网站出现乱码以及丢失了一些网站文件。在我们将网站全部迁移至Hostease虚拟主机后&#xff0c;为了再次避免这种情况发生&#xff0c;我们对网站做了一些安全防护&#xff0c;除了安装一些安全插件之外&#xff0c;我们还屏…

QGIS编译(跨平台编译)056:PDAL编译(Windows、Linux、MacOS环境下编译)

点击查看专栏目录 文章目录 1、PDAL介绍2、PDAL下载3、Windows下编译4、linux下编译5、MacOS下编译1、PDAL介绍 PDAL(Point Data Abstraction Library)是一个开源的地理空间数据处理库,它专注于点云数据的获取、处理和分析。PDAL 提供了丰富的工具和库,用于处理激光扫描仪、…