原生的Camera的设置里面有很多的选项,那么首先来看一下这些选项的布局文件camera_preferences.xml。截取一段该文件如下:
<PreferenceGroup xmlns:camera="http://schemas.android.com/apk/res/com.android.gallery3d" camera:title="@string/pref_camera_settings_category"> <IconListPreference camera:key="pref_camera_flashmode_key" camera:defaultValue="@string/pref_camera_flashmode_default" camera:title="@string/pref_camera_flashmode_title" camera:icons="@array/camera_flashmode_icons" camera:entries="@array/pref_camera_flashmode_entries" camera:entryValues="@array/pref_camera_flashmode_entryvalues" />
上面的代码属性PreferencesGroup、IconListPreferences属于自定义的属性。强调一下,IconListPreferences每个属性的前面的关键字“camrea”是根据代码第二行的xmlns:camera来的。平时我们用的属性前面关键字都是“android”,你会发现xmlns后面就是就是“android”。
这些自定义属性是在文件夹 res/values/attrs.xml文件里定义的,代码如下:
<resources> <declare-styleable name="CameraPreference"> <attr name="title" format="string" /> </declare-styleable> <declare-styleable name="ListPreference"> <attr name="key" format="string" /> <attr name="defaultValue" format="string|reference" /> <attr name="entryValues" format="reference" /> <attr name="entries" format="reference" /> </declare-styleable> <declare-styleable name="IconIndicator"> <attr name="icons" format="reference" /> <attr name="modes" format="reference" /> </declare-styleable> <declare-styleable name="IconListPreference"> <!-- If a preference does not have individual icons for each entry,it can has a single icon to represent it. --> <attr name="singleIcon" format="reference" /> <attr name="icons" /> <attr name="largeIcons" format="reference" /> <attr name="images" format="reference" /> </declare-styleable> <declare-styleable name="MaxLinearLayout"> <attr name="maxHeight" format="dimension" /> <attr name="maxWidth" format="dimension" /> </declare-styleable> </resources>
比如CameraPreference它有一个属性(name)title,该属性的格式(format)是string型。那么我们是怎么通过Java代码来获取这些xml的值得呢?还是以CamerePreferences为例,在CameraPreference.xml中的构造函数有一段代码如下:
public CameraPreference(Context context,AttributeSet attrs) { mContext = context; TypedArray a = context.obtainStyledAttributes( attrs,R.styleable.CameraPreference,0); mTitle = a.getString(R.styleable.CameraPreference_title); a.recycle(); }