Android Settings中Preference的理解以及使用

news2024/12/27 9:48:07

      Preference 是Android App 中重要的控件之一,Settings 模块大部分都是通过 Preference 实现

优点:

        Preference 可以自动显示我们上次设置的数据,Android提供preference这个键值对的方式来处理这种情况,自动保存这些数据,并立时生效,无需用户自己保存操作,只需要在xml中定义对应的Preference控件即可。

PreferenceActivity和PreferenceFragment:

        PreferenceActivity是一个非常有用的基类,当我们开发Android项目时避免不了选项设置,这些设置习惯用Preference来保存。Android专门为这种Activity提供了便捷的基PreferenceActivity。如果继承自Preference则不需要自己控制Preference的读写,PreferenceActivity会为我们处理一切。

        PreferenceActivity与普通的Activity不同,它不是使用界面布局文件,而是使用选项设置的布局文件。选项设置布局文件以PreferenceScreen作为根元素来表示定义一个参数设置界面布局。

       从Android 3.0以后官方不再推荐直接让PreferenceActivity加载选项设置布局文件,而是建议使用PreferenceFragment,PreferenceFragment  源码布局实际就是一个RecyclerView,通过读取Preference的布局来作为其item,通过adapter适配器展示

Preference的介绍和使用

 1.preference常用控件
             Preference 控件家庭          View控件家庭         控件含义                   

               Preference                         TextView                文本框                      

              CheckPreference                CheckBox              单选框                  

              EditTextPreference              EditText               输入文本框            

              ListPreference                     ListView                  列表框             

              RingtonePreference          ——                            铃声

              PreferenceCategory        类似于LinearLayou、RelativeLayout,用于组合一组Preference,使布局更具备层次感 。

              PreferenceScreen            所有Preference元素的根节点
 2.使用 需要加入依赖

 implementation ("androidx.preference:preference:1.2.0-alpha01")

(1)在res文件下定义xml文件夹,定义 test.xml;如下

(2)xml文件中是定义的preference控件

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:settings="http://schemas.android.com/tools">

    <PreferenceCategory
        android:key="test2"
        android:title="第二组设置">

        <CheckBoxPreference
            android:defaultValue="false"
            android:key="g2_checkbox_key"
            android:summaryOff="关"
            android:summaryOn="开"
            android:title="第二组设置勾选" />

        <ListPreference
            android:dialogIcon="@android:drawable/stat_sys_warning"
            android:dialogTitle="第二组列表设置"
            android:key="g2_list_key"
            android:summary="选择"
            android:title="第一组列表设置" />

    </PreferenceCategory>

    <SwitchPreference
        android:defaultValue="false"
        android:key="show_advanced_setting"
        android:summary="高级设置"
        android:title="显示高级设置" />

    <PreferenceCategory android:key="yh">
        <com.android.test3.prefence.RestrictedSwitchPreference
            android:defaultValue="true"
            android:icon="@drawable/ic_settings_wireless"
            android:key="login_dji_account"

            android:title="蓝牙" />

        <com.android.test3.prefence.RestrictedSwitchPreference
            android:defaultValue="true"
            android:icon="@drawable/ic_launcher_background"
            android:key="login_dji_account1"
           app:allowDividerAbove="true"
            android:title="网络" />

        <com.android.test3.prefence.RestrictedPreference
            android:icon="@drawable/ic_launcher_background"
            android:key="internet_settings"
            android:order="20"
            android:summary=" SAA"
            android:title="互联网"
            app:allowDividerAbove="true"

            settings:keywords="@string/keywords_internet"
            settings:useAdminDisabledSummary="true" />

        <com.android.test3.prefence.LuxPreference
            android:icon="@drawable/ic_settings_wireless"
            android:summary="ww"
            app:allowDividerAbove="true"
            android:title="测试自动" />

        <com.android.test3.prefence.LuxArrowPreference
            android:icon="@drawable/ic_settings_wireless"
            android:summary="ww"
            android:title="开始" />

    </PreferenceCategory>

</PreferenceScreen>

 (3)新建类PrefFragment.java,让其继承PreferenceFragment,并加载选项设置的布局文件:(核心代码是第6行和13行)

package com.android.test3.fragment;
import android.os.Bundle;

import androidx.annotation.Nullable;
import androidx.preference.PreferenceFragmentCompat;

import com.android.test3.R;

/**
 * @author hudebo
 * @desc
 * @date 2022/11/11
 */
public class PowerFragment extends PreferenceFragmentCompat {
    @Override
    public void onCreatePreferences(@Nullable Bundle savedInstanceState, @Nullable String rootKey) {
        //从xml文件加载选项 
        setPreferencesFromResource(R.xml.pref_two, rootKey);
    }
}

(4)然后,在MainActivity.java中加载上面的Fragment:

package com.android.test3;

import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import com.android.test3.fragment.PowerFragment;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getSupportFragmentManager().beginTransaction().replace(
                R.id.content,new PowerFragment() ).commitAllowingStateLoss();
    }

}

自定义Preference

有时候原生的preference满足不了我们的需求,比如,加个背景,加个其他控件等;此时就需要我们自定义控件解决

 比如:(1)给布局设置背景;我们继承Preference;在onBindViewHolder 方法中对通过holder获取控件其进行设置

package com.android.test3.prefence;

import android.content.Context;
import android.util.AttributeSet;

import androidx.core.content.res.TypedArrayUtils;
import androidx.preference.Preference;
import androidx.preference.PreferenceViewHolder;

import com.android.test3.PrefenceFeatureManager;
import com.android.test3.R;

/**
 * @author hudebo
 * @desc 自定义子Preference 支持圆角; 去除summary  支持icon title
 * @date 2022/11/24
 */
public class LuxPreference extends Preference {
    public LuxPreference(Context context, AttributeSet attrs, int defStyleAttr) {
        this(context, attrs, defStyleAttr, 0);
    }

    public LuxPreference(Context context, AttributeSet attrs) {
        this(context, attrs, TypedArrayUtils.getAttr(context, R.attr.luxPreferenceStyle,
                android.R.attr.preferenceStyle));
    }

    public LuxPreference(Context context) {
        this(context, null);
    }

    public LuxPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }

    @Override
    public void onBindViewHolder(PreferenceViewHolder holder) {
        super.onBindViewHolder(holder);
        if (holder != null) {
            PrefenceFeatureManager.setPrefenceBackground(this, holder.itemView);
        }
    }
}

(2)修改布局控件;a.首先我们在layout中定义绘制你的布局样式

 b.在自定义控件中引入你的布局即可

声明:setLayoutResource 方法即是覆盖原始preference的主布局;setWidgetLayoutResource 方法是覆盖原始布局的WidgetLayout的控件;如下图是preference的源码布局;

 setLayoutResource 是替换除了"@android:id/widget_frame" 这个控件的部分;setWidgetLayoutResource只是替换"@android:id/widget_frame"部分;如果setWidgetLayoutResource不设置也不影响;说明你得,右边没有布局

<?xml version="1.0" encoding="utf-8"?>
<!--
  ~ Copyright (C) 2015 The Android Open Source Project
  ~
  ~ Licensed under the Apache License, Version 2.0 (the "License");
  ~ you may not use this file except in compliance with the License.
  ~ You may obtain a copy of the License at
  ~
  ~      http://www.apache.org/licenses/LICENSE-2.0
  ~
  ~ Unless required by applicable law or agreed to in writing, software
  ~ distributed under the License is distributed on an "AS IS" BASIS,
  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  ~ See the License for the specific language governing permissions and
  ~ limitations under the License.
  -->

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:minHeight="?android:attr/listPreferredItemHeightSmall"
    android:gravity="center_vertical"
    android:paddingLeft="?android:attr/listPreferredItemPaddingLeft"
    android:paddingStart="?android:attr/listPreferredItemPaddingStart"
    android:paddingRight="?android:attr/listPreferredItemPaddingRight"
    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
    android:background="?android:attr/selectableItemBackground"
    android:clipToPadding="false"
    android:baselineAligned="false">

    <include layout="@layout/image_frame"/>

    <RelativeLayout
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:paddingTop="16dp"
        android:paddingBottom="16dp">

        <TextView
            android:id="@android:id/title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:singleLine="true"
            android:textAppearance="?android:attr/textAppearanceListItem"
            android:ellipsize="marquee"/>

        <TextView
            android:id="@android:id/summary"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@android:id/title"
            android:layout_alignLeft="@android:id/title"
            android:layout_alignStart="@android:id/title"
            android:layout_gravity="start"
            android:textAlignment="viewStart"
            android:textColor="?android:attr/textColorSecondary"
            android:maxLines="10"
            style="@style/PreferenceSummaryTextStyle"/>

    </RelativeLayout>

    <!-- Preference should place its actual preference widget here. -->
    <LinearLayout
        android:id="@android:id/widget_frame"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:gravity="end|center_vertical"
        android:paddingLeft="16dp"
        android:paddingStart="16dp"
        android:paddingRight="0dp"
        android:paddingEnd="0dp"
        android:orientation="vertical"/>

</LinearLayout>

以上就是一些个人理解;像通用的preference属性;以及点击等相关方法后续介绍; 喜欢的点个赞吧!!!

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

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

相关文章

链接生成二维码怎么弄?这些制作方法分享给大家

在现代社会中&#xff0c;链接生成二维码已经成为了一个非常实用的工具。通过将链接转换为二维码&#xff0c;我们可以将它们轻松地分享给朋友、家人或同事&#xff0c;而无需手动输入URL或复制粘贴。这使得信息的传播变得更加快捷和高效。例如&#xff0c;你正在计划一个聚会&…

Spring第三方bean管理

文章目录 1.第三方bean管理1.1 Bean1.2 小结 2.第三方bean依赖注入2.1 简单类型&#xff1a;成员变量2.2 引用类型&#xff1a;方法形参2.3 小结 3.总结 1.第三方bean管理 1.1 Bean 首先看一下目录结构&#xff0c;APP里面就初始化了SpringConfig文件 SpringConifg中就一句话…

【vue】8个非常实用的Vue自定义指令:

文章目录 一、批量注册指令&#xff0c;新建 directives/index.js 文件二、在 main.js 引入并调用【1】v-copy【2】v-longpress【3】v-debounce【4】v-emoji【5】v-LazyLoad【6】v-permission【7】vue-waterMarker【8】v-draggable 复制粘贴指令 v-copy 长按指令 v-longpress 输…

JUnit单元测试之旅

目录 1. 什么是单元测试和JUnit2. JUnit入门与基本注解2.1测试类的定义:2.2 生命周期注解:2.3断言注解:2.4 参数化单参数多参数通过方法获取参数 2.5 测试套件 三.用到的依赖包 1. 什么是单元测试和JUnit 单元测试(Unit Testing)是对软件中的最小可测试单元进行检查和验证。它…

PyCharm使用指南 - 如何创建密码短语生成器(上)

PyCharm是一种Python IDE&#xff0c;其带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具。此外&#xff0c;该IDE提供了一些高级功能&#xff0c;以用于Django框架下的专业Web开发。 PyCharm 最新下载 本文将展示如何使用免费的 PyCharm Community Edition 开…

Java 泛型的介绍

文章目录 1.学习目标2.什么是泛型3.引入泛型语法 4.泛型类的使用语法示例 6.泛型的上界语法示例 7.泛型的方法定义语法示例 8.通配符通配符解决什么问题通配符上界通配符下界 9.包装类基本数据类型和对应的包装类装箱和拆箱自动装箱和自动拆箱 1.学习目标 1.以能阅读 java 集合…

EventLoop事件循环

JavaScript是单线程语言 单线程执行任务队列的问题: 如果前一个任务非常耗时,则后续任务不得不等待,从而导致程序假死的问题。 同步任务和异步任务 ​ 为了防止某个耗时任务程序导致假死的问题,javascript把待执行的任务分为两类: 同步任务(synchronous) 又叫非耗时任务,指…

vue3-实战-02-管理后台项目集成

目录 1-集成element-plus 2-src别名配置 3-环境变量配置 4-svg图标配置 4.1-svg插件安装配置 4.2-svg封装为全局组件 5-集成sass 6-mock数据 7-axios二次封装 上一篇文章记录了项目初始化和项目配置&#xff0c;本章我们来进行项目集成。 1-集成element-plus 本次管…

【PWN · 总结】system返回shell(‘/bin/sh‘、‘sh‘、$(0))

pwn题中要通过system/excute等返回shell&#xff0c;进而cat flag。今天遇到一题&#xff0c;参数$(0)也可返回&#xff0c;有必要记录一下。 目录 前言 一、/bin/sh 1.strings 2.IDA 3.pwntools 4.ROPgadget 5.libc中寻找 二、sh 三、$(0) exp IDA查看机器码 …

交换机的4种网络结构方式:级联方式、堆叠方式、端口聚合方式、分层方式

交换机是计算机网络中重要的网络设备之一&#xff0c;用于实现局域网&#xff08;LAN&#xff09;内部的数据转发和通信。交换机可以采用不同的网络结构方式来满足不同的网络需求和拓扑结构。本文将详细介绍交换机的四种网络结构方式&#xff1a;级联方式、堆叠方式、端口聚合方…

c语言编程练习题:7-112 约分最简分式

#include <stdio.h> int gcd(int a,int b) {if(a<b)return gcd(b,a);if(a%b0)return b;elsegcd(b,a%b); } int main(){int a,b;if (scanf("%d/%d",&a,&b)!EOF){// 分析不敲钟的时间int gcd_value gcd(a,b);printf("%d/%d",a/gcd_value,b…

DMBOK知识梳理for CDGA/CDGP——第二章 数据处理伦理

关 注gzh “大数据食铁兽” 回复“知识点”获取《DMBOK知识梳理for CDGA/CDGP》常考知识点&#xff08;第二章数据处理伦理&#xff09; 第二章 数据处理伦理 第二章在 CDGA考试中分值占比不高&#xff0c;CDGP考试不考核。主要侧重点是考概念性的知识&#xff0c;难度较…

Matlab进阶绘图第22期—不等宽柱状图

不等宽柱状图是一种特殊的柱状图。 与常规柱状图相比&#xff0c;不等宽柱状图可以通过柱高与柱宽分别表达两个维度的数据&#xff0c;因此在多个领域得到应用。 在《Matlab论文插图绘制模板第91期》中&#xff0c;虽有介绍过利用Matlab自带bar函数绘制不等宽柱状图的方法&am…

LDGRB-01 3BSE013177R1 将数字输入和继电器输出结合

LDGRB-01 3BSE013177R1包的一部分是全面的通信选项&#xff0c;包括Modbus主/从或CS31&#xff0c;这种产品很少提供。128kB的用户内存和0.1秒/指令的程序处理时间只是AC500-eCo令人印象深刻的性能的两个例子。除了与现有AC500系列的互操作性&#xff0c;AC500-eCo系统还使用基…

PMP-范围管理的重要性

本篇文章主要是方便从事项目管理的“初学者”们了解范围管理的重要性 一、什么是范围管理 项目范围管理包括确保项目做且只做所需的全部工作&#xff0c;以成功完成项目的各个过程。管理项目范围主要在于定义和控制哪些工作应该包括在项目内&#xff0c;哪些不应该包括在项目内…

推动创意成果:创意过程如何改变 2023 年的业务

时下全球经济放缓&#xff0c;很多企业业务都陷入了增长瓶颈&#xff0c;如何突破&#xff1f;今天我们来聊聊一般业务突破的3种方式&#xff1a; 发现一片新的蓝海&#xff0c;迅速杀入占领生态位&#xff08;快&#xff09;&#xff1b; 发现结构性红利机会&#xff0c;大量投…

低代码开发重要工具:jvs-rules 规则引擎功能介绍(二)

一、JVS规则引擎接口管理 接口管理是将逻辑引擎对接所有的接口进行统一管理&#xff0c;便于各种应用统一引用。 接口的界面展示 接口列表的展示&#xff0c;接口列表是根据系统内部支持的接口进行展现&#xff0c;包括查看接口的详情 详情中包括&#xff0c;入参与出参的展…

QT(QPainter画圆弧)

文章目录 前言一、QPainter画圆弧方法二、使用示例三、画一个彩色环总结 前言 本篇文章给大家介绍一下如何使用QPainter来画圆弧。 一、QPainter画圆弧方法 drawArc() 函数是 Qt 绘图类库中的一个函数&#xff0c;用于在画布上绘制圆弧。可以通过设置起点角度和圆弧弧度来控…

Keil_C51之Memory_mode解析

有时我们会遇到这样的报错&#xff1a; *** ERROR L107: ADDRESS SPACE OVERFLOW SPACE: DATA SEGMENT: _DATA_GROUP_ LENGTH: 002CH Program Size: data117.0 xdata0 code6242 Target not created. Build Time Elapsed: 00:00:00 报错截图如下&#xff1a; 这类报…

程序员怎么玩转Linux

Linux下可以使用Python编写爬虫程序&#xff0c;常用的爬虫框架有Scrapy和BeautifulSoup。 Scrapy是一个基于Python的开源网络爬虫框架&#xff0c;可以快速高效地从网站上获取数据。它提供了强大的数据提取和处理功能&#xff0c;支持异步网络请求和分布式爬取等特性。 Beau…