算是 17 年第一篇文章,初衷就是简单介绍下用 xml 配置设置界面,为自定义设置界面 UI 做一个铺垫。
为了更好的用户体验,现在的大多数的应用都会提供一个设置界面,供用户去设置一些应用属性,比如用户名、昵称等信息的修改,或者还会有一些消息开关等都会在设置界面中完成。如下所示就是一个常见的设置界面截图(from 咕咚翻译)
类似这样的设置界面在一个应用中都会或多或少的存在。对于开发者而言,如何快速开发这样的设置界面呢?
对一个开发者而言,如果他对 Android 提供的设置 API 不了解,可能会自然而然的想到使用 layout 去画出来。然后在Activity 中实例化每个 item 对应的view,接着处理对应的 click、check 等事件。但是看到这里你应该已经知道 Android 已经提供了设置相关的 API,可以方便开发者快速开发设置 UI 。
这就是现在要说的 PreferenceActivity / PreferenceFragment 。
更多关于设置相关的官方介绍可通过 Setting 查阅。
建议直接看官方文档,比这里更加全面。
见名知意,
这俩是 Android 系统提供的两个跟设置相关的 API 组件,使用他们就可以方便快捷的开发出具有统一体验的设置UI。鉴于灵活性,大多数时候个人使用 ·PreferenceFragment 较多。
Preference
类的各种子类构建而成,而不是使用 View
对象构建用户界面。 如下所示就是一个常规的设置配置文件。
<?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <CheckBoxPreference android:key="pref_sync" android:title="@string/pref_sync" android:summary="@string/pref_sync_summ" android:defaultValue="true" /> <ListPreference android:dependency="pref_sync" android:key="pref_syncConnectionType" android:title="@string/pref_syncConnectionType" android:dialogTitle="@string/pref_syncConnectionType" android:entries="@array/pref_syncConnectionTypes_entries" android:entryValues="@array/pref_syncConnectionTypes_values" android:defaultValue="@string/pref_syncConnectionTypes_default" /> </PreferenceScreen>
public static class SettingsFragment extends PreferenceFragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Load the preferences from an XML resource addPreferencesFromResource(R.xml.preferences); } ... }
然后,正如您对其他任何 Fragment
的处理一样,您可以将此片段添加到 Activity
。例如:
public class SettingsActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Display the fragment as the main content. getFragmentManager().beginTransaction() .replace(android.R.id.content, new SettingsFragment()) .commit(); } }
至此,启动 SettingsActivity 就可以看到一个设置界面了。
这里简单说下背后的原理。
PreferenceFragment 和 PreferenceActivity 的布局本身包含一个 ListView ,使用 addPreferencesFromResource
方法后,PreferenceFragment 他们会去解析 xml 文件中定义的 Preference 对象,并把它们实例化,然后通过 Adapter 的形式填充到 ListView。然后就是我们看到的设置界面了。
这篇文章属于技术介绍类文章,主要是为下一篇文章《自定义设置 UI 》做铺垫,其实没什么干货可写的,因为官方文档已经很详细,所以文章一开头,我也建议直接去看官方提供的文档,现在已经有很好的中文版本了,而且讲得很详细,很权威。