目录

一,Preference介绍

二,PreferencesActivity介绍

三,PreferenceActivity的使用

四,PreferenceActivity分别和ListFragment,PreferenceFragment组合使用

五,Preference数据获取

总结


一,Preference介绍

Android提供的preference以键值对的方式来处理这种情况:自动保存设置的数据,并立时生效,而这种使用android sharedpreferences方式进行保存的,不需要我们手动来写sharedpreferences;

常见的Preference控件有:

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

二,PreferencesActivity介绍

是Android中专门用来实现程序设置界面及参数存储的一个Activity。从Android 3.0以后官方不再推荐直接让PreferenceActivity加载选项设置布局文件,而是建议使用PreferenceFragment(此类在API级别28中已弃用。替代类androidx库下的PreferenceFragmentCompat,有关androidx的问题有很多,这里不过多介绍 ),二者用法类似。PreferenceActivity在API级别29中已被弃用。PreferenceActivity与普通的Activity不同,它不是使用界面布局文件,而是使用选项设置的布局文件

PreferencesActivity官方介绍文档:

https://developer.android.com/reference/android/preference/PreferenceActivity.html

三,PreferenceActivity的使用

3.1,在res下新建xml目录,在xml目录下新建PreferenceActivity需要的布局文件setting.xml(使用PreferenceScreen 最为根节点)

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" > <ListPreferenceandroid:key="setting_language_preference"android:title="语言设置"android:entries="@array/language_entries"android:entryValues="@array/language_values"android:summary="支持:普通话,粤语,英语,德语,法语"android:defaultValue="mandarin"  /><EditTextPreferenceandroid:key="setting_preference"   android:title="连接超时" android:dialogTitle="请输入时间(0-10000)ms"android:summary="默认值1800"android:defaultValue="1800" /><CheckBoxPreferenceandroid:key="@string/pref_key_translate"android:title="Love me ?"android:defaultValue="false" /></PreferenceScreen>

在res/values/strings.xml文件中新建以上需要的资源数据

<string-array name="language_entries"><item>普通话</item><item>粤语</item><item>英语</item><item>俄语</item><item>法语</item>
</string-array>
<string-array name="language_values"><item>mandarin</item><item>cantonese</item><item>en_us</item><item>russian</item><item>french</item>
</string-array>
<string name="pref_key_translate">love_me</string>

3.2,创建PreferenceActivity的子类SettingActivity

public class SettingActivity extends PreferenceActivity {public static final String PREFER_NAME = "setting";private EditTextPreference mVadbosPreference;@SuppressWarnings("deprecation")public void onCreate(Bundle savedInstanceState) {requestWindowFeature(Window.FEATURE_NO_TITLE);super.onCreate(savedInstanceState);getPreferenceManager().setSharedPreferencesName(PREFER_NAME);addPreferencesFromResource(R.xml.setting);mVadbosPreference = (EditTextPreference)findPreference("setting_preference");}}

3.3,运行看一下效果图如下:

注意:运行时候,会自动在/data/data/<packagename>/shared_prefs/目录生成一个文件名为setting文件;

四,PreferenceActivity分别和ListFragment,PreferenceFragment组合使用

PreferenceFragment官方文档:

https://developer.android.com/reference/android/preference/PreferenceFragment

4.1,在res下新建xml目录,在xml目录下新建PreferenceActivity需要的布局文件activity_settings.xml(使用preference-headers

最为根节点,通过header引入Fragment)

<?xml version="1.0" encoding="utf-8"?>
<preference-headers xmlns:android="http://schemas.android.com/apk/res/android"><header android:fragment="com.ang.demo.ui.fragment.ListFragmentSettings"android:icon="@drawable/ic_launcher"android:title="Settings"android:summary="真球忙"></header><headerandroid:fragment="com.ang.demo.ui.fragment.PreferenceFragmentTest"android:title="PreferenceFragmentTest"></header><headerandroid:icon="@mipmap/ic_launcher"android:summary="view baidu website"android:title="baidu"><intentandroid:action="android.intent.action.VIEW"android:data="https://m.baidu.com/" /></header>
</preference-headers>

注意:header各个属性的功能作用;

上面header引入ListFragment的子类ListFragmentSettings代码:

public class ListFragmentSettings extends ListFragment {protected ArrayAdapter<String> mAdapter;protected String mData[];public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);mData = getActivity().getResources().getStringArray(R.array.contries);mAdapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_single_choice, mData);setListAdapter(mAdapter);}public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {View view = inflater.inflate(R.layout.fragment_radio_zone_settings, container,false);return view;}public void onListItemClick(ListView l, View v, int position, long id) {super.onListItemClick(l, v, position, id);}
}

上面header引入PreferenceFragment的子类PreferenceFragmentTest代码:

public class PreferenceFragmentTest extends PreferenceFragment {@Overridepublic void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);//从xml文件加载选项addPreferencesFromResource(R.xml.fragment_preference_test);}
}

fragment_preference_test布局文件(也是在res/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:title="使用GPS"android:summary="使用Gps查看应用的位置"/></PreferenceCategory><PreferenceCategoryandroid:key="mymsg"android:summary="个人信息s"android:title="个人信息"><EditTextPreferenceandroid:key="myname"android:title="请输入真实姓名"android:summary="姓名"/></PreferenceCategory></PreferenceScreen>

4.2,创建PreferenceActivity的子类PreferenceActivityTest(名字都是随便起的)

public class PreferenceActivityTest extends PreferenceActivity {private static List<String> fragments = new ArrayList<String>();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);if (hasHeaders()) {Button button = new Button(this);button.setText("Exit");setListFooter(button);}}@Overridepublic void onBuildHeaders(List<Header> target) {loadHeadersFromResource(R.xml.activity_settings, target);//从xml文件加载Preference选项fragments.clear();for (Header header : target) {fragments.add(header.fragment);}}//android 4.3以上版本需要做验证,验证方式有很多 https://www.manongdao.com/article-73175.html@Overrideprotected boolean isValidFragment(String fragmentName) {return fragments.contains(fragmentName);}
}

4.3,运行后的效果图:

注意:ListFragment导入import android.app.ListFragment;别导入V4包下的(切记哦),如果导入V4包下的会出现  java.lang.ClassCastException异常;详细详细异常信息:

java.lang.RuntimeException:Unable to start activity ComponentInfo{com.ang.demo/com.ang.demo.ui.activity.PreferenceActivityTest}: android.app.Fragment$InstantiationException: Trying to instantiate a class com.ang.demo.ui.fragment.ListFragmentSettings that is not a Fragment

五,Preference数据获取

以上都是Preference的使用和保存数据;如何获取Preference的数据呢;其实和shardpreference获取数据一样;通过key获取;

总结

讲了这么多,其实都是 Preference的子类在PreferenceActivity和PreferenceFragment中的应用;以上实现设置的功能,谷歌官方文档推荐使用androidx包下的Preference及子类和PreferenceFragmentCompat;总是还是v4 v7 v13等support 库迁移androidx的问题;

PreferenceActivity使用介绍相关推荐

  1. Android之PreferenceActivity (转载)

    看到很多书中都没有对PreferenceActivity做介绍,而我正好又在项目中用到,所以就把自己的使用的在这总结一下,也方便日后查找. PerferenceActivity是什么,看下面的截图: ...

  2. Android应用Preference相关及源码浅析(Preference组件家族篇)

    | public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) | @ ...

  3. android 切换 preferencefragment,Android PreferenceActivity与PreferenceFragment详解及简单实例_Android_脚本之家...

    Android  PreferenceActivity与PreferenceFragment 前言 转来转去又回到了Android,闲话少说,这里是参考Android原生的Settings应用来介绍一 ...

  4. 【Android UI设计与开发】第07期:底部菜单栏(二)Fragment的详细介绍和使用方法

    转载请注明出处:http://blog.csdn.net/yangyu20121224/article/details/8995025 由于TabActivity在Android4.0以后已经被完全弃 ...

  5. Android的配置界面PreferenceActivity

    我想大家对于android的系统配置界面应该不会陌生吧,即便陌生,那么下面的界面应该似曾相识吧,假若还是不认识,那么也没有关系,我们这一节主要就是介绍并讲解android 中系统配置界面的使用,相信大 ...

  6. Android PreferenceActivity 使用

    我想大家对于android的系统配置界面应该不会陌生吧,即便陌生,那么下面的界面应该似曾相识吧,假若还是不认识,那么也没有关系,我们这一节主要就是介绍并讲解android 中系统配置界面的使用,相信大 ...

  7. 转-Android之PreferenceActivity

    在着手开发原生应用Settings前还有必要了解一下PreferenceActivity ,这里有一篇介绍PreferenceActivity 的文章,还不错 http://www.cnblogs.c ...

  8. PreferenceActivity与PreferenceFragment理解

    一.概要 PreferenceActivity介绍: PreferenceActivity实际是用来显示一个或多个 preferences header的,而 一个preference header ...

  9. Pro Android 4 第一章 Android 开发平台介绍

    当今这个时代,计算比以往任何一个时代都距离人们更近.各种手持设备已经变身为计算平台.无论是平板和是手机,移动设备凭借其强大的通用计算能力,已经成为真正意义上的个人电脑(PC).所有的传统计算机厂商已经 ...

  10. Toolbar的介绍和使用

    1.Toolbar介绍 Toolbar是应用程序中使用的标准工具栏. Toolbar是应用程序布局中使用的Actionbar的泛华,虽然Actionbar是传统Activity的不透明窗口装饰的控制框 ...

最新文章

  1. R语言ggplot2可视化线图(line plot):当数据有中断、缺失时R不会将数据绘制为连续的线图、而是出现断点
  2. 仓库管理员怎样做台账_工作日志之仓库管理员与会计之间的对接工作
  3. 【BIEE】BIEE报表根据维度表展示事实表不存在的维度
  4. 马科维茨的均值方差模型(MPT)粒子群优化--Python实现
  5. Yii框架特点及测试考虑
  6. Teams Bot如何判断用户所在的时区
  7. python智能机器人设计与实现_从AI模型到智能机器人:基于Python与TensorFlow
  8. cocos2d-x的CCSequence与CCRepeatForever的混用
  9. linux删除文件未释放空间问题处理
  10. gif透明背景动画_ppt模板3D卡通GIF动画PPT素材,多种多样的日常动作
  11. LinkedHashMap 底层分析
  12. 苹果开发者被盯上了!Xcode又双叒叕被攻击了
  13. MPUSH消息推送服务器搭建
  14. repo clean
  15. ALS模拟环境光传感芯片的工作原理
  16. Build Metal-based Core Image kernels with Xcode
  17. C语言的飞机订票系统
  18. 好记性不如烂笔头-笔记记录方法公开
  19. 要怎么在计算机里清除桌面内存,怎么清理电脑内存 最全电脑内存清理方法
  20. FCM聚类与K-means聚类的分析比较

热门文章

  1. 数据统计学习的5个基本流程
  2. 怎么检查计算机网络是连接,电脑怎么查看网络连接
  3. 弥补性能鸿沟,傲腾在企业应用中加速普及
  4. php学习redis买什么书,redis
  5. avast:中兴手机预装恶意软件 嵌入固件底层
  6. java服务器 c 服务器_c 编写服务器
  7. 《PowerMock实战手册》读书笔记及个人总结
  8. Linux安装Diamond软件,1.1 Linux下安装diamond
  9. 狂神说Linux学习笔记
  10. VISSIM二次开发(Python)大作业总结1