PreferenceActivity的使用及示例界面的实现(二)

     在上一篇博文中,我们详细介绍了PreferenceActivity的开发示例中的关于布局方面的准备工作,虽然写的很简单,但是由于是笔者真正开始写互联网博文,以前有过尝试,总是坚持不下来,还希望各位多多体谅哈。
     毫无疑问,Android这几年确实是很火的,短短的时间内积累了成千上万的开发人员为其疯狂,而笔者也是千千万万中的一位,其SDK强大的功能深深的吸引着我,以前略略的开发过Symbian上的程序,很痛苦,但是转战Android后,情况明显比以前好了很多,得益于Android的开源和快速发展,以及众多的Android的疯狂爱好者提供的精品讲解和示例代码。
     好了,不多说了,我们进入正题,开始进行Android的开发的PreferenceActivity的代码阶段。
     首先,在上一篇博文中,我们已经建立好了一个Preference的XML文件preference.xml,记录着我们的布局,那么如何将布局文件添加到代码中去呢?传统的Layout布局的时候,系统会默认的生成代码setContentView(R.layout.main);那么,使用Preference的时候是不是还是这样的呢?笔者认为Preference既然作为一个布局文件,应该是可以这样做的吧,但是当笔者将其载入模拟器(setContentView(R.xml.preference))中时,报出如下错误:
    Caused by: android.view.InflateException: Binary XML file line #2: Error inflating class PreferenceScreen
    Caused by: java.lang.ClassNotFoundException: android.view.PreferenceScreen in loader dalvik.system.PathClassLoader@44c17b30
而出错的代码行正为“setContentView(R.xml.preference)",目前笔者尚未搞清楚,只能等下一篇博文的时候细细分析吧。
     事实上,在PreferenceActivity开发中,当前的类需要继承PreferenceActivity而非Activity,在添加XML代码的时候,使用的是addPreferenceFromResource(R.xml.preference);运行我们创建的工程,得到的界面如下所示,是不是很熟悉呢?因为很多的设置界面都是采用的这个风格的,不仅适合很多应用,同时也适合很多的游戏,是Android的开发者必须掌握的一个程序。
    
     因此到这里,基本的界面布局已经全部测试完毕,那么接下来的事情呢,当然就是控件的响应和数据的操作了。
     在PreferenceActivity中,控件的获取和普通的Layout是不一样的,前者是findPreference(String s),而后者是findViewById(int Layoutid);并且传参也一样,前者传进去的为控件的key,即在preference.xml中变量定义的key,标识着这个控件,然后就可以对这个控件进行各种操作了,常用的对于控件的操作有如下几种:
     public boolean onPreferenceChange(Preference preference, Object newValue){}为用户对控件的改变的响应
     public boolean onPreferenceClick(Preference preference){}为用户点击Preference的响应,一般见于对文本的Preference的响应,如软件的使用说明等,此时可以使用弹出一个Dialog的方式,提示用户的软件操作和开发者的版权等相关信息。
     那么就不多说了,继续进入开发环节吧,前面有说到,如果用户点击开始软件这个按钮,系统又是如何捕捉到的呢?
     首先,系统需要确定的是,到底是哪一个Preference控件被按下,onPreferenceChange函数针对的是全局,那么此时标识哪个控件被按下的就是该控件的key,简述如下:
     if (preference.getkey.equals("your preference key")){}else if (){}以此可以实现知道是需要哪一个控件产生响应;但是单单知道是哪一个控件产生响应更多的时候是没有用途的,我们需要知道是什么状态下(如CheckBox是开还是关?)
     在PreferenceActivity中,当用户点击了响应的Preference后,此Preference的值(如CheckBoxPreference的值即为true,false,分别标识是否打开,EditTextPreference的值即为在输入框中输入的值)是存在/data/data/you_package_name/shared_prefs/you_package_name_you_xml_name.xml中的,而每一个选项的标识,即为该控件对应的key,因此对PreferenceActivity来说,一个控件的key(即id是非常重要的,如果你要使用这个Preference所对应的值的话),Android给我们广大的开发者提供了这样的一种方法,可以直接取到某个Preference对应的值,具体的方法如下(我们以CheckBoxPreference为例):
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
    boolean value = prefs.getString(”checkboxpreference”, “true”);
    有过SharedPreferences经验的同学应该知道,其作用就是为了取得checkboxpreference这个字段所存储的值,默认为"true",返回值为boolean型,这也许就是为什么这个Activity叫做PreferenceActivity的原因吧。为了开发方便,笔者经常将对数据进行操作的方法封装成一个完整的类,对数据的操作只需要使用该类的对象调用相关的方法即可完成,为了完成本程序剩下的一些功能,笔者所写的数据操作类如下所示(仅供参考):
    public class Sunshine_Preference_DataOption {
      //相关变量的声明与定义
      SharedPreferences sp = null;
      
      //构造函数
      public Sunshine_Preference_DataOption(Context context){
            sp = PreferenceManager.getDefaultSharedPreferences(context);//实现初始化
      }
      
      //取得CheckBoxPreference中对应的值,返回值为boolean型
      public boolean getCheckBoxPreferenceValue(){
            boolean value = sp.getBoolean("your checkboxpreference key", true);//替换其中的变量名为你自己的key即可,默认返回true;
            return value;
      }
      
}
  这里笔者仅是以CheckBoxPreference的值的获取为代码,提供给大家进行参考,其他的Preference是一样的。
  前面提到了关于单Preference,即产生软件帮助文档和开发者版权信息的Preference,其没有相关的参数保存,自然不存在参数的变化,那么此时,它是怎样产生Dialog的呢?这里,它使用public boolean onPreferenceClick(Preference preference){}这个函数,当侦测到是preference(你的版权信息和帮助的Preference)时,产生一个Dialog,在上面部署你想要的各种信息。
     其实在数据改变的过程中,有一个函数一直在监听着某个Preference中的值的变化,可以及时的进行相关的更新操作,之所以特别提到这个函数,是因为笔者在进行ListPreference的数据更新后想要把更新后的数据以summary的方式显示在ListPreference上,你有更好的方法么?笔者试过线程、Handler等方式均没有实现,但是在翻看API的时候,偶然间看到了这个方法,那么,既然有了这个方法,自然实现上述的功能很简单了,具体的做法为,获得操作该Preference,再进行更改即可,具体的做法如下:
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
                  String key) {
                  if (key.equals("listpreference")){
                       //你的listpreference中更新的数据,具体取得方法,前面已经有所介绍
                        listpreference_num.setSummary("your listpreference num");
            }
      }
即可实现前面所述的功能。

笔者结语:
   花了一个晚上写了关于PreferenceActivity,几乎各种操作都使用过,才真正的提起笔写下这篇博文,主要是为更多的开发者提供一个更方便的查询资料的地方,避免大家花费更多的时间和精力;关于PreferenceActivity的总结当然很不完整,但是我相信,有了上面的一些简单的介绍,大家对PreferenceActivity应该不会陌生,一些基本的操作已经在博文中有了详细的介绍,当然,若有任何的疑问,可以咨询我:zhangganhan@126.com.
期待您的来信~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值