Android Preference简单介绍

news2024/12/27 20:38:15

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";
    @Override
    protected 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 {
        @Override
        public 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() {
                @Override
                public 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">

    <FrameLayout
        android: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">

        <EditTextPreference
            app:key="signature"
            app:title="@string/signature_title"
            app:useSimpleSummaryProvider="true" />

        <ListPreference
            app: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">

        <SwitchPreferenceCompat
            app:key="sync"
            app:title="@string/sync_title" />

        <SwitchPreferenceCompat
            app:dependency="sync"
            app:key="attachment"
            app:summaryOff="@string/attachment_summary_off"
            app:summaryOn="@string/attachment_summary_on"
            app:title="@string/attachment_title" />

    </PreferenceCategory>

    <SwitchPreference
        app: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 包含了很多标签属性:

<PreferenceCategory
        android: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
 <PreferenceCategory
        android: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.PrimarySwitchPreference
        android: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">
        <intent
            android:action="android.settings.WIFI_SETTINGS"
            android:targetClass="Settings$WifiSettingsActivity" />
    </com.android.settingslib.PrimarySwitchPreference>

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

(3)settingslib自定义类:AddPreference
    <com.android.settings.widget.AddPreference
        android: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.RestrictedSwitchPreference
        android: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.RestrictedPreference
        android: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.coloradmin.cn/o/1541134.html

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

相关文章

Docker Command

小试牛刀 # 查看docker版本 docker -v docker --version # 查看帮助 docker --help # 永远的Hello World docker run hello-world镜像操作 查看本地已有的镜像 docker images -a :列出本地所有的镜像&#xff08;含中间映像层&#xff09; -q :只显示镜像ID --digests :显示…

39 openlayers 对接地图图层 绘制点线面圆

前言 这里主要是展示一下 openlayers 的一个基础的使用 主要是设计 接入地图服务器的 卫星地图, 普通的二维地图, 增加地区标记 增加 省市区县 的边界标记 基础绘制 点线面园 等等 测试用例 <template><div style"width: 1920px; height:1080px;" &g…

【嵌入式】Docker镜像构建指南:引领应用部署的革新之路

&#x1f9d1; 作者简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟。提供嵌入式方向的学习指导、简历面…

深度学习pytorch——GPU加速(持续更新)

使用 .to(device)&#xff0c;以前使用 .cuda() &#xff0c;但是现在基本不使用了。 代码示例&#xff1a; 查看电脑GPU运行情况&#xff1a; 使用Ctrl Shift ESC快捷键&#xff1a;

Unreal中的四元数FQuat

四元数&#xff1a;Quaternion&#xff0c;四维数域内的数&#xff0c;可用于描述点在三维空间内的旋转&#xff08;因为三维的旋转可以理解为绕某个轴旋转一个角度&#xff0c;所以需要4个维度的信息&#xff09; 注意这里的旋转的轴&#xff0c;指的是从原点到 ( x , y , z )…

vue3+threejs新手从零开发卡牌游戏(九):添加抽卡逻辑和动效

首先优化下之前的代码&#xff0c;把game/deck/p1.vue中修改卡组方法和渲染卡组文字方法提到公共方法中&#xff0c;此时utils/common.ts完整代码如下&#xff1a; import { nextTick } from vue; import * as THREE from three; import * as TWEEN from tweenjs/tween.js impo…

数据库基础篇-------语法结构

友友们&#xff0c;大家好&#xff0c;今天我们来回顾我们的数据库啦&#xff0c;数据库技术是在我们大一就进行了解的&#xff0c;但是在大二的时候有的学校会进行数据库开发技术的教学&#xff0c;这两本书是不一样的&#xff0c;数据库基础更加偏向于对应的基础语法结构&…

计算方法实验2:列主元消元法和Gauss-Seidel迭代法解线性方程组

Task 即已知 y 0 0 , y 100 1 y_00,y_{100}1 y0​0,y100​1&#xff0c;解线性方程组 A y b \mathbf{A}\mathbf{y} \mathbf{b} Ayb&#xff0c;其中 A 99 99 [ − ( 2 ϵ h ) ϵ h 0 ⋯ 0 ϵ − ( 2 ϵ h ) ϵ h ⋯ 0 0 ϵ − ( 2 ϵ h ) ⋯ 0 ⋮ ⋮ ⋱ ⋱ ⋮ 0 0 ⋯…

数学建模综合评价模型与决策方法

评价方法主要分为两类&#xff0c;其主要区别在确定权重的方法上 一类是主观赋权法&#xff0c;多次采取综合资讯评分确定权重&#xff0c;如综合指数法&#xff0c;模糊综合评判法&#xff0c;层次评判法&#xff0c;功效系数法等 另一类是客观赋权法&#xff0c;根据各指标…

(C语言)浮点数在内存中的存储详解

1. 浮点数 常见的浮点数&#xff1a;3.14159、 1E10等 &#xff0c;浮点数家族包括&#xff1a; float、double、long double 类型。 浮点数表示的范围&#xff1a; float.h 中定义. 2. 浮点数的存储 我们先来看一串代码&#xff1a; int main() {int n 9;float* pFloa…

高中信息技术教资刷题笔记_大题篇

1.选择排序 2. SMTP属于TCP/IP协议体系结构中的哪一层&#xff1f;请列出其通信的三个阶段。 3.高中信息技术课程的基本理念/意义 4.视频作品制作和发布的主要环节 5.信息社会责任内涵及学生表现 6.教学活动意图 ①突出学生的主体地位。材料中&#xff0c;王老师设计的“扮演谍…

关系型数据库mysql(4)事务

目录 一.事务的概念 1.事务的定义 2.事务的特点 2.1原子性 2.2一致性 2.4持久性 3.事务之间的相互影响 3.1脏读 3.2不可重复读 3.3幻读 3.4丢失更新 4. 事务的隔离级别&#xff08;如何解决事务的干扰&#xff09; 4.1查询全局事务隔离级别 4.2查询全局事务 …

【零基础C语言】联合体(共用体)和枚举

目录 自定义类型&#xff1a;联合体(共用体)和枚举 1.自定义类型&#xff1a;联合体(共用体) 1.1 联合体的声明 1.2 联合体的特点 ​编辑1.3 联合体的大小计算 1.4使⽤联合体是可以节省空间的 1.5使用联合体写一个程序判断机器是大端还是小端存储 2.自定义类型&#xff1a;…

详解|temu选品师是什么?算蓝海项目吗?

在快速发展的跨境电商行业中&#xff0c;temu选品师这一岗位逐渐受到人们的关注。temu作为拼多多旗下的跨境电商平台&#xff0c;致力于为中国商家提供一个通向全球市场的桥梁。而temu选品师&#xff0c;则是这个桥梁上不可或缺的角色。 temu选品师主要负责在海量商品中挑选出具…

探索Zalo:从社交APP到Mini App开发指南

1.Zalo是什么&#xff1f; Zalo是一款源自越南的即时通讯和社交软件&#xff08;相当于国内的微信&#xff09;&#xff0c;由越南VNG公司开发。它集成了多种功能&#xff0c;包括但不限于免费的文字、语音、视频消息发送&#xff0c;高质量的语音和视频通话&#xff0c;群聊功…

电子电器架构 —— 诊断数据DTC具体故障篇

电子电器架构 —— 诊断数据DTC起始篇 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师 (Wechat:gongkenan2013)。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 本就是小人物,输了就是输了,不要在意别人怎么看自己。江湖一碗茶,喝完再挣扎…

批量重命名文件名,批量管理文件,复制后轻松删除原文件

在现代工作中&#xff0c;我们经常需要处理大量的文件&#xff0c;无论是工作文档、图片还是视频资料。对于很多人来说&#xff0c;文件管理是一项繁琐且耗时的任务。不过&#xff0c;现在有一种高效的文件管理方法&#xff0c;可以帮助你轻松复制文件后删除原文件夹&#xff0…

Redis入门到实战-第四弹

Redis实战热身Strings 篇 完整命令参考官网 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不一定100%复现, 还要以官方信息为准 https://redis.io/Redis概述 Redis是一个开源的&#xff08;采用BSD许可证&#xff09;&#xff0c;用作数据库、缓存、消息代理…

鸿蒙开发学习【地图位置服务组件】

简介 移动终端设备已经深入人们日常生活的方方面面&#xff0c;如查看所在城市的天气、新闻轶事、出行打车、旅行导航、运动记录。这些习以为常的活动&#xff0c;都离不开定位用户终端设备的位置。 当用户处于这些丰富的使用场景中时&#xff0c;系统的位置定位能力可以提供…

解析服务器出现大量 TIME_WAIT 和 CLOSE_WAIT 状态的原因及排查方法

服务器出现大量 TIME_WAIT 状态的原因有哪些&#xff1f; 首先要知道 TIME_WAIT 状态是主动关闭连接方才会出现的状态&#xff08;别陷入一个误区不是只有客户端才能主动关闭连接的&#xff09;&#xff0c;所以如果服务器出现大量的 TIME_WAIT 状态的 TCP 连接&#xff0c;就是…