Android之PreferenceFragment详解

article/2025/11/6 2:27:57

【正文】

一、PreferenceFragment的引入:

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

PreferenceActivity与普通的Activity不同,它不是使用界面布局文件,而是使用选项设置的布局文件

选项设置布局文件以PreferenceScreen作为根元素来表示定义一个参数设置界面布局。

从Android 3.0以后官方不再推荐直接让PreferenceActivity加载选项设置布局文件,而是建议使用PreferenceFragment,二者用法类似。所以今天就来学习一下。

下面的这张截图就是一个典型的例子:

我们会看到整个页面被分为几组:无线和网络、个人、账户、设备、系统。这个分组(或者叫分类)就是PreferenceCategory

Wifi右边有开关,这一项就是CheckBoxPreference;其他还有ListPreference和EditTextPreference。

你的每一次设置,都会被Preference自动保存下来,这就是setting的数据持久化。每个Preference都是以键值对的形式保存下来的

PreferenceActivity的继承关系图:(不推荐使用)

PreferenceFragment的继承关系图:(推荐使用

 

二、在XML文件中Preference的种类:

根节点中一定是<PreferenceScreen> 元素,在这个元素中可以添加不同的Preference。常见的Preference控件有:

  • 直接子类:DialogPreference, PreferenceGroup, RingtonePreference, TwoStatePreference
  • 非直接子类:CheckBoxPreference, EditTextPreferenceListPreference, MultiSelectListPreference, PreferenceCategory, PreferenceScreen, SwitchPreference

我们还是通过实际的例子来实现吧。 

【实例】

先新建一个工程文件:

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

复制代码
 1 package com.example.m05_preffragment01;
 2 
 3 import android.os.Bundle;
 4 import android.preference.PreferenceFragment;
 5 
 6 public class PrefFragment extends PreferenceFragment {
 7     @Override
 8     public void onCreate(Bundle savedInstanceState) {
 9         // TODO Auto-generated method stub
10         super.onCreate(savedInstanceState);
11         
12         //从xml文件加载选项 
13         addPreferencesFromResource(R.xml.preferences);
14     }
15 }
复制代码

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

复制代码
 1 package com.example.m05_preffragment01;
 2 
 3 import android.app.Activity;
 4 import android.app.FragmentManager;
 5 import android.app.FragmentTransaction;
 6 import android.os.Bundle;
 7 
 8 public class MainActivity extends Activity {
 9 
10     @Override
11     protected void onCreate(Bundle savedInstanceState) {
12         super.onCreate(savedInstanceState);
13         setContentView(R.layout.activity_main);
14         
15         //加载PrefFragment
16         FragmentManager fragmentManager = getFragmentManager();
17         FragmentTransaction transaction = fragmentManager.beginTransaction();
18         PrefFragment prefFragment = new PrefFragment();
19         transaction.add(R.id.prefFragment, prefFragment);
20         transaction.commit();
21         
22     }
23     
24 }
复制代码

接下来的知识就是重头戏了,既然PrefFragment要加载选项设置的布局文件R.xml.preferences,那我们就来定义一下这个preferences.xml

在res目录下新建立一个xml目录,在该目录中新建文件preferences.xml:

关于preferences.xml的文件里面的代码,请看下面这一段。

 

五、preference详解:

1、<PreferenceCategory>的方式进行分组:

preferences.xml举例如下:

复制代码
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" ><!-- 设置的类别 --><PreferenceCategory android:key="mylocation"android:summary="我的位置"android:title="我的位置源">              <CheckBoxPreference android:key="wireless_network"android:summary="使用无线网络查看应用程序中的位置"android:title="使用无线网络"/>          </PreferenceCategory><PreferenceCategory android:key="mymsg"android:summary="个人信息"android:title="个人信息">              <EditTextPreference android:key="myname"android:title="请输入真实姓名"android:summary="姓名"/>          </PreferenceCategory>    </PreferenceScreen>
复制代码

上方代码中,一个<PreferenceCategory>就是一个类别,单个的<PreferenceCategory>可以放入任意的Preference控件。我们在第一个类别中放入了CheckBoxPreference控件,在第二个类别中放入了EditTextPreference控件。运行效果如下:

运行时候,会自动在/data/data/<packagename>/shared_prefs/目录生成一个文本文件:

注:这个文本的文件名太长了,我们可以在上方PrefFragment.java的第13行代码后面加上这样一句话来修改文件名:(这里我将文件名修改为:mysetting)

getPreferenceManager().setSharedPreferencesName("mysetting");

文本内容如下:

我们现在在CheckBoxPreference中打钩,然后在EditTextPreference中输入内容:

文本内容显示如下:

 

2、显示子屏幕subscreens方式的进行分组:

复制代码
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:title="Settings" >
 4 
 5     <PreferenceScreen
 6         xmlns:android="http://schemas.android.com/apk/res/android"
 7         android:summary="settings about emotions"
 8         android:title="Emotions" >
 9         <CheckBoxPreference
10             android:defaultValue="true"
11             android:summaryOff="No,I am sorry."
12             android:summaryOn="Yes,I love you!"
13             android:title="Love me?" >
14         </CheckBoxPreference>
15         <CheckBoxPreference
16             android:defaultValue="false"
17             android:summaryOff="No,you are a good person."
18             android:summaryOn="Yes,I hate you!"
19             android:title="Hate me?" >
20         </CheckBoxPreference>
21     </PreferenceScreen>
22     
23     <PreferenceScreen
24         xmlns:android="http://schemas.android.com/apk/res/android"
25         android:summary="settings about relations"
26         android:title="Relations" >
27         <CheckBoxPreference
28             android:defaultValue="true"
29             android:summaryOff="No,I am sorry."
30             android:summaryOn="Yes,we are family!"
31             android:title="Family?" >
32         </CheckBoxPreference>
33         <CheckBoxPreference
34             android:defaultValue="false"
35             android:summaryOff="No,I am sorry."
36             android:summaryOn="Yes,we are friends!"
37             android:title="Friends?" >
38         </CheckBoxPreference>
39     </PreferenceScreen>
40 
41 </PreferenceScreen>
复制代码

运行效果如下:

点击上方第一个preference,进入下图中左侧界面;点击上方第二个preference,进入下图中右侧界面。效果如下:

 

3、ListPreference控件:

点击该控件后,将列出一个单选按钮的列表。用法如下:

复制代码
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" ><PreferenceCategory android:key="mylocation"android:summary="我的位置"android:title="我的位置源">    <ListPreference android:key="mycities"android:title="所属城市"android:summary="点击弹出城市列表"android:dialogTitle="请选择城市"android:entries="@array/cities"android:entryValues="@array/cities"/></PreferenceCategory></PreferenceScreen>
复制代码

上方代码中,PreferenceScreen为根标签,ListPreference为子标签。ListPreference的常见属性如下:

  • android:key 唯一标识符,和android:id相类似,PreferenceManager可以以其为参数通过findPreference获取指定的preference 。 注意,这个android:key的值也是Preference文件里面的XML“键”名
  • android:title 大标题
  • android:summary 标题下面的小字(这个要作为选项卡才有)
  • android:entries 弹出的对话框中,列表显示的文本内容,注意哦,这里指定的是一个数组。
  • android:entryValues 与android:entries相对应的值
  • android:defaultValue 当对应值不存在时的默认值
  • android:dialogTitle 弹出的对话框中的标题信息

关于android:entriesandroid:entryValues的区别,要强调一下:

  • android:entries:The human-readable array to present as a list. 是展现给用户的列表的值。
  • android:entryValues :he array to find the value to save for a preference when an entry from entries is selected. 展现的用户的选择列表的每个元素选择后,需要存储到手机中,这里的entryValues就是列表中各个元素被选择后存储到手机中的值(通过sharedPreferences保存在/data/data/<packagename>/shared_prefs/目录下)。简单的说就是此处是数据库中的值。上面的android:entries是展现给用户的列表的值。

我们在上方代码中的第13、14行引用了数据,紧接着我们要在values目录下的strings.xml文件中定义这个被引用的城市列表(即数据来源):

复制代码
 1 <?xml version="1.0" encoding="utf-8"?>
 2 <resources>
 3 
 4     <string name="app_name">m05_PrefFragment01</string>
 5     <string name="action_settings">Settings</string>
 6     <string name="hello_world">Hello world!</string>
 7 
 8     <string-array name="cities">
 9         <item>成都</item>
10         <item>重庆</item>
11         <item>黄冈</item>
12     </string-array>
13 
14 </resources>
复制代码

上方代码中,8至12行:即加粗部分,是我添加的数据源。

运行程序效果如下:

 

六、监听事件onPreferenceTreeClick()方法:

public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen Preference preference) 

当任何一个preference控件被点击,都将触发该方法。但是可以通过preference.getKey()这个方法找到具体是哪个preference被点击了,因为每个preference的key都是唯一的

【实例】

现将preferences.xml这个设置选项的布局文件,定义如下:

复制代码
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" ><!-- 设置的类别 --><PreferenceCategoryandroid:key="mylocation"android:summary="我的位置"android:title="我的位置源" ><CheckBoxPreferenceandroid:key="wireless_network"android:summary="使用无线网络查看应用程序(例如Google地图)中的位置"android:title="使用无线网络" /><CheckBoxPreferenceandroid:key="gps_satellite_setting"android:summary="定位时,精确到街道级别(取消选择可节约电量)"android:title="启用GPS卫星设置" /></PreferenceCategory><PreferenceCategoryandroid:key="mymessage"android:summary="个人信息设置"android:title="个人信息设置" ><CheckBoxPreferenceandroid:key="yesno_save_individual_info"android:title="是否保存个人信息" /><EditTextPreferenceandroid:key="individual_name"android:summary="请输入真实姓名"android:title="姓名 " /><ListPreferenceandroid:entries="@array/cities"android:entryValues="@array/cities"android:key="mycity"android:summary="所属城市"android:title="所属城市" /></PreferenceCategory></PreferenceScreen>
复制代码

运行效果如下:

现在我们需要做的是,选中上方红框中的CheckBoxPreference,对应下面的EditTextPreference为编辑状态;否则,如果CheckBoxPreference没有被选中,则EditTextPreference为不可编辑状态。修改PrefFragment.java的代码,其完整版代码如下:

复制代码
 1 package com.example.m05_preffragment01;
 2 
 3 import android.os.Bundle;
 4 import android.preference.CheckBoxPreference;
 5 import android.preference.EditTextPreference;
 6 import android.preference.Preference;
 7 import android.preference.PreferenceFragment;
 8 import android.preference.PreferenceScreen;
 9 
10 public class PrefFragment extends PreferenceFragment {
11 
12     @Override
13     public void onCreate(Bundle savedInstanceState) {
14         // TODO Auto-generated method stub
15         super.onCreate(savedInstanceState);
16         
17         //从xml文件加载选项 
18         addPreferencesFromResource(R.xml.preferences);
19     }
20     
21     @Override
22     public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
23             Preference preference) {
24         //如果“保存个人信息”这个按钮被选中,将进行括号里面的操作
25         if("yesno_save_individual_info".equals(preference.getKey())) {            
26             CheckBoxPreference checkBoxPreference = (CheckBoxPreference)findPreference("yesno_save_individual_info");
27             EditTextPreference editTextPreference = (EditTextPreference)findPreference("individual_name");
28             //让editTextPreference和checkBoxPreference的状态保持一致
29             editTextPreference.setEnabled(checkBoxPreference.isChecked());
30         }
31         // TODO Auto-generated method stub
32         return super.onPreferenceTreeClick(preferenceScreen, preference);
33     }
34 }
复制代码

代码解释:

当任何一个preference控件被点击,都将触发onPreferenceTreeClick()方法(22行),但是可以通过preference.getKey()这个方法找到具体是哪个preference被点击(25行)。

26行、27行:通过public Preference findPreference(CharSequence key)找到对应的preference,然后强转为它的子类。

29行:核心代码,让editTextPreference和checkBoxPreference的状态保持一致。

运行效果如下:

这样,我们的功能就实现了。



本文转自:http://www.cnblogs.com/smyhvae/p/4020469.html




http://chatgpt.dhexx.cn/article/n8bMZNbu.shtml

相关文章

PreferenceActivity和PreferenceFragment实现设置界面

在进行Android开发的过程中&#xff0c;有时需要实现一个设置界面&#xff0c;就像下面的系统的显示设置。这样的界面自己实现起来略显繁琐&#xff0c;好在Android中已经实现了这样的设置界面&#xff0c;那就是PreferenceActivity。并且PreferenceActivity还有一个莫大的好处…

PreferenceFragment设置界面的编写

效果图&#xff1a; 布局文件&#xff1a; <PreferenceScreenxmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://schemas.android.com/apk/res-auto"><PreferenceCategoryandroid:title"string/basic_setting…

Android PreferenceFragment

PreferenceFragment用来显示首选项的设置&#xff0c;效果图如下&#xff1a; 主布局文件&#xff1a; <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools"android:layout_widt…

PreferenceFragment使用

PreferenceFragment 在Android3.0之前&#xff0c;设置界面使用PreferenceActivity&#xff0c;在Android3.0之后&#xff0c;官方推荐使用PreferenceFragment&#xff0c;对应于碎片化技术。 使用 新建Fragment 新建GeneralPreferenceFragment 继承PreferenceFragment&…

Android设置页面之PreferenceFragment的简单使用示例

1.PreferenceFragment介绍 a.PreferenceFragment实际为Fragment的一个子类 b.创建一个PreferenceFragment需要绑定一个xml来显示视图 c.绑定后没就可以当作普通Fragment使用&#xff0c;只是每new一个实例就会创建一个SharePreference,把之前绑定的xml中的值写入保存&#x…

Personal preference

Personal preference 相关文章Algorithm&#xff1a;Algorithm的进阶之路 目录 程序猿成长之路 Personal 历史问题记录 程序猿成长之路 Personal 1、C:\Users\99386\AppData\Local\kingsoft\WPS Cloud Files\userdata\qing\filecache\jazve的云文档\knowledge 历史问题记录…

PreferenceFragment详解

在上篇文章中我们讲述了Android 5.1 Settings的源码解析Android 5.1 Settings模块源码分析_Flying snow-CSDN博客&#xff0c; 其中在介绍到Android的Sub Setting时&#xff0c;我们说到基本上都是使用的PreferenceFragment技术&#xff0c;今天我们就来了解一下关于Preferenc…

Android进阶——Preference详解之Preference系的基本应用和管理(二)

引言 前面一篇文章Android进阶——Preference详解之初识Preference及Preference系&#xff08;一&#xff09;简单描述下了Preference的家族构成和基本知识&#xff0c;相信对于Preference早已不会陌生&#xff0c;肯定也跃跃欲试了吧&#xff0c;这篇文章就给大家总结下Prefe…

Android自定义PreferenceScreen的Layout布局,并获取控件

先说一下需求&#xff0c;要在<PreferenceScreen>里添加一个自定义的Layout&#xff0c;实现如下效果&#xff1a; 操作步骤&#xff1a; 1、在res/layout目录创建一个xml文件&#xff0c;名为my_preference_layout.xml&#xff0c;代码如下&#xff1a; <?xml ver…

PreferenceScreen的使用(非常有用)

在res下建个xml文件夹,建立2个xml文件: preferencescreentest_one.xml <?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"android:key="using_categor…

使用PreferenceActivity和PreferenceScreen构建应用的设置

对于每个应用程序来说&#xff0c;都要有一些属于用户自己的设置&#xff0c;满足不同需求。当我们点击menu时&#xff0c;如下&#xff1a; 点击settings时&#xff0c;出现&#xff1a; 那么这样的效果是怎么实现的呢&#xff1f;我只是来个简单介绍&#xff0c;给自己做备忘…

PreferenceScreen

对于每个应用程序来说&#xff0c;都要有一些属于用户自己的设置&#xff0c;满足不同需求。当我们点击menu时&#xff0c;如下&#xff1a; 点击settings时&#xff0c;出现&#xff1a; 那么这样的效果是怎么实现的呢&#xff1f;我只是来个简单介绍&#xff0c;给自己做备忘…

PreferenceFragment的使用

文章目录 PreferenceFragment简介PreferenceFragment使用PreferenceFragment 扩展 PreferenceFragment简介 在我们写一个项目的时候&#xff0c;基本都有选项设置界面&#xff0c;这类设置界面的原理基本都是本地的一些个性化设置&#xff0c;通过读取本地设置来改变某些差异显…

Android中Preference的使用以及监听事件分析

转载请注明出处: http://blog.csdn.net/qinjuning 在Android系统源码中&#xff0c;绝大多数应用程序的UI布局采用了Preference的布局结构&#xff0c;而不是我们平时在模拟器中构建应用程序时使用的View布局结构&#xff0c;例如&#xff0c;Setting模块中布局。当然&#xf…

screentogif 录屏

screentogif的由来 screentogif于2013年诞生&#xff0c;主要的开发者是巴西帅哥Nicke Manarin。 最初的目的只是为了学习和提供一款软件供开发者个人使用。 在2016重新启动项目&#xff0c;使得screentogif变得更加实用。 screentogif的安装 进入官网下载软件安装包。 s…

android PreferenceScreen使用笔记

preference.xml <?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"><Preference android:title="基本信息"android:layout="@layout/tex…

PreferenceScreen 的使用

java代码&#xff1a; public class Main3Activity extends PreferenceActivity {Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState); // setContentView(R.layout.activity_main3); //加载布局文件&#xff0c;相当于…

PreferenceScreen的应用

PreferenceScreen preference是偏好&#xff0c;首选的意思&#xff0c;PreferenceScreen个人翻译成 “偏好显示”&#xff0c;明白这个意思就好&#xff0c;就是说根据特点灵活的定义显示内容风格&#xff0c;一个屏幕可以包含多个风格&#xff0c;像系统自带的声音设置界面。…

PreferenceScreen 中如何自定义SwitchPreferenceCompat的布局

PreferenceScreen 中如何自定义SwitchPreferenceCompat的布局 Android Preference 使用请看这篇 Android Preference使用 系统设置的代码&#xff1a; public class SetActivity extends AppCompatActivity { Override protected void onCreate(Bundle savedInstanceSta…

Preference的使用(2) --- PreferenceCategory PreferenceScreen

上一节有讲到Preference的基本使用跟API的介绍 &#xff0c;没有看的话请先阅读 Preference的使用&#xff08;1&#xff09; 现在介绍其子类PreferenceCategory 跟 PreferenceScreen&#xff0c;现在看下继承关系 如上图&#xff0c;他们都是继承自PreferenceGroup的先看一…