当你要写一个类似于设置这种界面时,你可能会需要使用到好多的layout
,这样做会非常复杂,这时,android
提供了一个简单的方法,就是
让你的activity
继承PreferenceActivity
,然后创建一个preference
这个xml文件,这个文件是在res/xml中的,然后在activity
中调用
addPreferencesFromResource(R.xml.mypreferencelayout);
方法将自己在xml中定义的界面显示在activity
上,对于xml文件的定义,我们需要
搞懂这几个标签的意思:
- CheckBoxPreference:CheckBox选择项,对应的值的
ture
或flase
。 - EditTextPreference:输入编辑框,值为
String
类型,会弹出对话框供输入。 - ListPreference: 列表选择,弹出对话框供选择。
- Preference:只进行文本显示,需要与其他进行组合使用。
- PreferenceCategory:用于分组。
- PreferenceScreen:PreferenceActivity的根元素。
- RingtonePreference:系统玲声选择。
对于这几个标签中比较常用的属性有:
title:显示的标题
key:唯一标识(至少在同一程序中是唯一)。
summary:副标题(小字体显示)等等。
那么这是系统自带的标签,我们如何来自定义一个标签呢?答案是,我们自定义一个类,让它继承某一个preference,然后在其中自定义要实现
的功能,样式等。那么如何将它和xml挂钩呢?我们只需要将这个类的全称写在xml中就行,类似于
<com.example.android_textpreferencescreen1.MyPreferenceScreen
android:key="m1"
android:title="myPreference"
/>
其中com.example.android_textpreferencescreen1.MyPreferenceScreen
就是这个类的全称,包括包名和类名,这种方式也适用于别的,比如一个
类继承了view
,然后在相同类型的布局文件中将这个类的全称写下来就行,注意是要相同类型,如果你将继承了view
的类写在preference
的xml
中,那么就会报java.lang.ClassCastException
这个错误。总之如果在xml里边使用自定义控件,那么只需要将类的全称写在xml中就可以。
通过这种方式添加时,当加载xml
文件时加载到这一项时,只会调用这个类的构造函数,当有多个构造函数时,是调用哪个呢?
结果是调用两个参数的这个,至于为什么呢?因为
public View (Context context)
是在java代码创建视图的时候被调用,如果是从xml
填充的视图,就不会调用这个,
public View (Context context, AttributeSet attrs)
这个是在xml创建但是没有指定style
的时候被调用,attr
里边传过来的是xml
里边对应的height
、width
等参数,包括自己定义的参数,
public View (Context context, AttributeSet attrs, int defStyle)
这个不用说也懂了吧
这是在xml文件中的将自定义的preference和activity挂钩的操作,那么相对应的我们应该有在代码中的操作,这个我们应该知道
了,就是在activity中new一个自定义的类的对象就行了。
那么我们除了有在xml中对于preference
的操作,我们就还有在代码中的操作,这也很简单,我们使用c1=(CheckBoxPreference) findPreference("c1");
方法来寻找到对应的preference
,这里的key
就是xml
中对应的key
,找到这个对象后,我们就可以使用这个对象来操作对应的preference
了。
同时,在做这个实验的时候发现创建对话框出现unable to add window token null is not for an application
错误时,是因为传入的Context
的参数不对,需要将参数改为
你的activity的名字.this。