【51CTO译文】许多应用程序可以得益于共享参数设置(Shared Preferences)——这是Android平台解决应用程序设置持久性存储的办法。有许多办法可以创建UI用户界面,用来为用户收集和显示持久性设置。最容易的办法就是使用PreferencesActivity,它提供了与平台的其余部分一致的外观感觉,包括设备的系统参数设置。不妨通过该教程来学习如何使用PreferencesActivity。
我们简单的Mobiletuts新闻源阅读应用程序还没有一个正式名称(我们一直称之为TutList),它需要改进针对后台更新过程的用户控制。因而,我们会添加一个参数设置,帮助控制后台更新过程。
构建应用参数设置屏幕的UI设计准备工作
不管怎样,开始之前都要下载一个素材,并导入到Eclipse。
***步:添加UI设计共享参数设置助手
共享参数设置常常用在整个应用程序当中。关于单个设置的名称和参数设置组的名称的定义必须存储起来,以便用在整个应用程序当中。有几个办法来解决这个问题。我们采用的解决办法涉及一个辅助类(helper class),用于一致地访问特定的设置值,而参数设置键存储在资源字符串中,以便从代码及其他资源文件来访问。
不妨从辅助类代码开始入手:
- public class TutListSharedPrefs {
- public final static String PREFS_NAME = "tutlist_prefs";
- public static boolean getBackgroundUpdateFlag(Context context) {
- SharedPreferences prefs = context.getSharedPreferences(PREFS_NAME, 0);
- return prefs.getBoolean(
- context.getString(R.string.pref_key_flag_background_update),
- false);
- }
- public static void setBackgroundUpdateFlag(Context context, boolean newValue) {
- SharedPreferences prefs = context.getSharedPreferences(PREFS_NAME, 0);
- Editor prefsprefsEditor = prefs.edit();
- prefsEditor.putBoolean(
- context.getString(R.string.pref_key_flag_background_update),
- newValue);
- prefsEditor.commit();
- }
- }
在这个类中,我们定义了一个公共变量来确认设置参数组或集的名称,名为PREFS_NAME。我们还使用了名为pref_key_flag_background_update的资源字符串,指定特定的设置参数名称定义。你应该为自己的资源添加字符串,那样可以定义该标识符。我们把其值设为“background_update_flag”,但重要的是,所用的值在每个地方都是一样的。
虽然我们添加了一个setBackgroundUpdateFlag()方法,以求全面,但不会使用这个方法。下文解释了原因。
***,我们把这个Java类添加到了com.mamlambo.tutorial.tutlist.data程序包,因为那个类似乎最有关系。
第二步:添加UI设计参数设置屏幕活动
Android软件开发工具包(SDK)包括了一种一致的方法为用户提供设置:PreferenceActivity。这个特殊的Activity(活动)类与参数设置资源文件一起,共同使得开发人员很容易一致地配置和显示大多数类型的应用设置。与其他应用程序和系统参数设置屏幕相一致,也使得这些屏幕对用户来说很熟悉、很容易。
想为“TutList”应用程序添加PreferenceActivity,首先添加一个新的活动调用TutListPreferencesActivity,让它扩展PreferenceActivity(我们把它添加到主程序包)。由于我们没有使用默认的参数设置名称,就需要设定这个PreferenceActivity将使用的参数设置名称。此外,我们需要告诉它使用哪个参数设置资源文件。这将告诉它如何显示参数设置,并且告诉它这个屏幕显示和改动哪些参数设置。
在这个活动的onCreate()方法里面,使用setSharedPreferencesName()方法,参数设置组常量在我们在***步定义的参数设置辅助类中有所定义。然后调用addPreferencesFromResource()方法。我们会在下一步定义这个资源。
眼下,这整个类看起来像这样:
- public class TutListPreferencesActivity extends PreferenceActivity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- getPreferenceManager().setSharedPreferencesName(
- TutListSharedPrefs.PREFS_NAME);
- addPreferencesFromResource(R.xml.prefs);
- }
- }
我们会在整个教程中改进这个类。但首先,我们创建名为prefs的被引用XML资源。
第三步:定义UI设计参数设置屏幕资源
为应用程序资源添加一个新的XML文件,名为prefs.xml。你可以使用新的Android XML文件向导,填写相应字段,如下图所示。这还会在正确的位置:/res/xml目录创建XML文件。
参数设置活动资源文件包括 标签和一个或多个标签,后者用于组织设置和各种类型特定属性。为了满足我们简单的参数设置要求,我们可以使用,它装入并存储布尔值。其他可能的类型包括EditTextPreference和ListPreference选择,分别用于收集字符串以及从项目列表中进行选择。
下面是整个内容参数设置屏幕资源文件prefs.xml:
- <?xml version="1.0" encoding="utf-8"?>
- <PreferenceScreen
- xmlns:android="http://schemas.android.com/apk/res/android">
- <PreferenceCategory
- android:title="Background Updating">
- <CheckBoxPreference
- android:summary="@string/pref_summary_background_update_flag"
- android:title="@string/pref_title_background_update_flag"
- android:key="@string/pref_key_flag_background_update" />
- </PreferenceCategory>
- </PreferenceScreen>
这表明了把键字符串作为资源来存储的***理由之一:它们既可以装入到Java中,又可以在XML文件中直接使用。
第四步:启动UI设计参数设置屏幕
下一步,我们将把菜单项添加到列表片段上,以启动参数设置屏幕。在做这一步时,我们还将更新刷新菜单项,不再开始进行预定更新。
为此,先编辑/res/menu/options_menu.xml资源文件,添加一个新的菜单项:
- <item
- android:id="@+id/settings_option_item"
- android:icon="@drawable/ic_menu_preferences"
- android:title="@string/settings"></item>
你还需要为菜单项标题(@string/settings)添加相应的资源字符串,并添加一个相应的图标(@drawable/ic_menu_preferences)。我们使用来自Android SDK的标准的参数设置图标,该图标对用户来说会很熟悉。
接下来,编辑onCreateOptionsMenu()方法,为新的菜单项提供正确的Intent:
- Intent prefsIntent = new Intent(getActivity().getApplicationContext(),
- TutListPreferencesActivity.class);
- MenuItem preferences = menu.findItem(R.id.settings_option_item);
- preferences.setIntent(prefsIntent);
现在,更新onOptionsItemSelected()方法。由于菜单项不止一个,现在有必要使用开关语句。在该开关语句里面,我们可以使用为每个菜单项分配的常量标识符,以区别用户的选择。
- Override
- ic boolean onOptionsItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case R.id.refresh_option_item:
- getActivity().startService(item.getIntent());
- break;
- case R.id.settings_option_item:
- getActivity().startActivity(item.getIntent());
- break;
- }
- return true;
***,不要忘了为Android清单文件添加新的活动:
- <activity
- android:name=".TutListPreferencesActivity" />
现在你可以运行应用程序,看到新的菜单项。
参数设置活动启动后,可以存储和检索后台更新参数设置。它应该看起来如下:
看起来很好,但还没有做实际的操作。虽然标记在参数设置里面进行更新,但还没有地方来检查值,看看要不要开始后台更新。
第五步:开始和停止警报
在上一步,对setRecurringAlarm()辅助方法的调用已被删除。实际上,这个方法在TutListFragment类中不再需要。而是把它移到TutListPreferencesActivity类。然后添加第二个辅助方法,名为cancelRecurringAlarm():
- cancelRecurringAlarm():
- private void cancelRecurringAlarm(Context context) {
- Intent downloader = new Intent(context, AlarmReceiver.class);
- PendingIntent recurringDownload = PendingIntent.getBroadcast(context,
- 0, downloader, PendingIntent.FLAG_CANCEL_CURRENT);
- AlarmManager alarms = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
- alarms.cancel(recurringDownload);
- }
***,覆盖TutListPreferencesActivity类的onPause()方法;视情况需要,设置或取消循环警报。在这个方法里面,你可以使用辅助方法getBackgroundUpdateFlag()来检查参数设置的值:更新的值,并调用相应的方法:
- @Override
- ected void onPause() {
- super.onPause();
- Context context = getApplicationContext();
- if (TutListSharedPrefs.getBackgroundUpdateFlag(getApplicationContext())) {
- setRecurringAlarm(context);
- } else {
- cancelRecurringAlarm(context);
- }
现在,无论何时检查设置,都可以根据当前值来更新警报。由于默认值是“off”,用户必须进入到设置,才能启用后台下载。
关于PreferenceFragment
你可能会想我们为什么不用新的PreferenceFragment类。原因很简单:它在兼容性库中还没有得到支持。由于我们想要让TutList应用程序不仅仅与Android 3.0设备兼容,所以我们还无法使用它。但愿兼容性库会继续得到改进。
结论
在该教程中,大家学会了如何用PreferencesActivity使用PreferencesScreen资源文件,以便快速、轻松地创建一个功能活动,以便管理应用程序的参数设置数据。此外,你为用户提供了控制后台更新TutList应用程序的一个方法。