Android UI设计:构建应用参数设置屏幕

原创
移动开发 Android
51CTO曾在前文中介绍了谷歌官方教程:Android UI设计技巧,本文为51CTO独家译文,我们将介绍《Android UI设计:构建应用参数设置屏幕》。

【51CTO译文】许多应用程序可以得益于共享参数设置(Shared Preferences)——这是Android平台解决应用程序设置持久性存储的办法。有许多办法可以创建UI用户界面,用来为用户收集和显示持久性设置。最容易的办法就是使用PreferencesActivity,它提供了与平台的其余部分一致的外观感觉,包括设备的系统参数设置。不妨通过该教程来学习如何使用PreferencesActivity。

我们简单的Mobiletuts新闻源阅读应用程序还没有一个正式名称(我们一直称之为TutList),它需要改进针对后台更新过程的用户控制。因而,我们会添加一个参数设置,帮助控制后台更新过程。

构建应用参数设置屏幕的UI设计准备工作

不管怎样,开始之前都要下载一个素材,并导入到Eclipse。

***步:添加UI设计共享参数设置助手

共享参数设置常常用在整个应用程序当中。关于单个设置的名称和参数设置组的名称的定义必须存储起来,以便用在整个应用程序当中。有几个办法来解决这个问题。我们采用的解决办法涉及一个辅助类(helper class),用于一致地访问特定的设置值,而参数设置键存储在资源字符串中,以便从代码及其他资源文件来访问。

不妨从辅助类代码开始入手:

  1. public class TutListSharedPrefs {  
  2.  
  3.     public final static String PREFS_NAME = "tutlist_prefs";  
  4.  
  5.    
  6.  
  7.     public static boolean getBackgroundUpdateFlag(Context context) {  
  8.  
  9.         SharedPreferences prefs = context.getSharedPreferences(PREFS_NAME, 0);  
  10.  
  11.         return prefs.getBoolean(  
  12.  
  13.                 context.getString(R.string.pref_key_flag_background_update),  
  14.  
  15.                 false);  
  16.  
  17.     }  
  18.  
  19.    
  20.  
  21.     public static void setBackgroundUpdateFlag(Context context, boolean newValue) {  
  22.  
  23.         SharedPreferences prefs = context.getSharedPreferences(PREFS_NAME, 0);  
  24.  
  25.         Editor prefsprefsEditor = prefs.edit();  
  26.  
  27.         prefsEditor.putBoolean(  
  28.  
  29.                 context.getString(R.string.pref_key_flag_background_update),  
  30.  
  31.                 newValue);  
  32.  
  33.         prefsEditor.commit();  
  34.  
  35.    } 
  36.  
  37.  }  

在这个类中,我们定义了一个公共变量来确认设置参数组或集的名称,名为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()方法。我们会在下一步定义这个资源。

眼下,这整个类看起来像这样:

  1. public class TutListPreferencesActivity extends PreferenceActivity {  
  2.  
  3.     @Override 
  4.  
  5.     protected void onCreate(Bundle savedInstanceState) {  
  6.  
  7.         super.onCreate(savedInstanceState);  
  8.  
  9.    
  10.  
  11.         getPreferenceManager().setSharedPreferencesName(  
  12.  
  13.                 TutListSharedPrefs.PREFS_NAME);  
  14.  
  15.         addPreferencesFromResource(R.xml.prefs);  
  16.  
  17.     }  
  18.  

我们会在整个教程中改进这个类。但首先,我们创建名为prefs的被引用XML资源。

第三步:定义UI设计参数设置屏幕资源

为应用程序资源添加一个新的XML文件,名为prefs.xml。你可以使用新的Android XML文件向导,填写相应字段,如下图所示。这还会在正确的位置:/res/xml目录创建XML文件。

定义UI设计参数设置屏幕资源

参数设置活动资源文件包括 标签和一个或多个标签,后者用于组织设置和各种类型特定属性。为了满足我们简单的参数设置要求,我们可以使用,它装入并存储布尔值。其他可能的类型包括EditTextPreference和ListPreference选择,分别用于收集字符串以及从项目列表中进行选择。

下面是整个内容参数设置屏幕资源文件prefs.xml:

  1. <?xml version="1.0" encoding="utf-8"?>  
  2.  
  3. <PreferenceScreen 
  4.  
  5.     xmlns:android="http://schemas.android.com/apk/res/android">  
  6.  
  7.     <PreferenceCategory 
  8.  
  9.         android:title="Background Updating">  
  10.  
  11.         <CheckBoxPreference 
  12.  
  13.             android:summary="@string/pref_summary_background_update_flag" 
  14.  
  15.             android:title="@string/pref_title_background_update_flag" 
  16.  
  17.             android:key="@string/pref_key_flag_background_update" />  
  18.  
  19.     </PreferenceCategory>  
  20.  
  21. </PreferenceScreen> 

这表明了把键字符串作为资源来存储的***理由之一:它们既可以装入到Java中,又可以在XML文件中直接使用。

第四步:启动UI设计参数设置屏幕

下一步,我们将把菜单项添加到列表片段上,以启动参数设置屏幕。在做这一步时,我们还将更新刷新菜单项,不再开始进行预定更新。

为此,先编辑/res/menu/options_menu.xml资源文件,添加一个新的菜单项:

  1. <item 
  2.  
  3.     android:id="@+id/settings_option_item" 
  4.  
  5.     android:icon="@drawable/ic_menu_preferences" 
  6.  
  7.     android:title="@string/settings"></item> 

你还需要为菜单项标题(@string/settings)添加相应的资源字符串,并添加一个相应的图标(@drawable/ic_menu_preferences)。我们使用来自Android SDK的标准的参数设置图标,该图标对用户来说会很熟悉。

接下来,编辑onCreateOptionsMenu()方法,为新的菜单项提供正确的Intent:

  1. Intent prefsIntent = new Intent(getActivity().getApplicationContext(),  
  2.  
  3.         TutListPreferencesActivity.class);  
  4.  
  5.    
  6.  
  7. MenuItem preferences = menu.findItem(R.id.settings_option_item);  
  8.  
  9. preferences.setIntent(prefsIntent);  

现在,更新onOptionsItemSelected()方法。由于菜单项不止一个,现在有必要使用开关语句。在该开关语句里面,我们可以使用为每个菜单项分配的常量标识符,以区别用户的选择。

  1.    Override 
  2.  
  3. ic boolean onOptionsItemSelected(MenuItem item) {  
  4.  
  5. switch (item.getItemId()) {  
  6.  
  7. case R.id.refresh_option_item:  
  8.  
  9.     getActivity().startService(item.getIntent());  
  10.  
  11.     break;  
  12.  
  13. case R.id.settings_option_item:  
  14.  
  15.     getActivity().startActivity(item.getIntent());  
  16.  
  17.     break;  
  18.  
  19. }  
  20.  
  21. return true;  

***,不要忘了为Android清单文件添加新的活动:

  1. <activity 
  2.  
  3.     android:name=".TutListPreferencesActivity" /> 

现在你可以运行应用程序,看到新的菜单项。

新的菜单项

参数设置活动启动后,可以存储和检索后台更新参数设置。它应该看起来如下:

存储和检索后台更新参数设置

看起来很好,但还没有做实际的操作。虽然标记在参数设置里面进行更新,但还没有地方来检查值,看看要不要开始后台更新。

第五步:开始和停止警报

在上一步,对setRecurringAlarm()辅助方法的调用已被删除。实际上,这个方法在TutListFragment类中不再需要。而是把它移到TutListPreferencesActivity类。然后添加第二个辅助方法,名为cancelRecurringAlarm():

  1. cancelRecurringAlarm(): 
  2.  
  3.        private void cancelRecurringAlarm(Context context) {  
  4.  
  5.     Intent downloader = new Intent(context, AlarmReceiver.class);  
  6.  
  7.     PendingIntent recurringDownload = PendingIntent.getBroadcast(context,  
  8.  
  9.             0, downloader, PendingIntent.FLAG_CANCEL_CURRENT);  
  10.  
  11.     AlarmManager alarms = (AlarmManager) getSystemService(Context.ALARM_SERVICE);  
  12.  
  13.     alarms.cancel(recurringDownload);  
  14.  

***,覆盖TutListPreferencesActivity类的onPause()方法;视情况需要,设置或取消循环警报。在这个方法里面,你可以使用辅助方法getBackgroundUpdateFlag()来检查参数设置的值:更新的值,并调用相应的方法:

  1.    @Override 
  2.  
  3. ected void onPause() {  
  4.  
  5. super.onPause();  
  6.  
  7. Context context = getApplicationContext();  
  8.  
  9. if (TutListSharedPrefs.getBackgroundUpdateFlag(getApplicationContext())) {  
  10.  
  11.     setRecurringAlarm(context);  
  12.  
  13. } else {  
  14.  
  15.     cancelRecurringAlarm(context);  
  16.  
  17. }  

现在,无论何时检查设置,都可以根据当前值来更新警报。由于默认值是“off”,用户必须进入到设置,才能启用后台下载。

关于PreferenceFragment

你可能会想我们为什么不用新的PreferenceFragment类。原因很简单:它在兼容性库中还没有得到支持。由于我们想要让TutList应用程序不仅仅与Android 3.0设备兼容,所以我们还无法使用它。但愿兼容性库会继续得到改进。

结论

在该教程中,大家学会了如何用PreferencesActivity使用PreferencesScreen资源文件,以便快速、轻松地创建一个功能活动,以便管理应用程序的参数设置数据。此外,你为用户提供了控制后台更新TutList应用程序的一个方法。

责任编辑:佚名 来源: 51CTO
相关推荐

2010-09-16 16:37:09

SIP协议栈

2010-09-26 09:54:43

JVM参数设置

2009-11-18 14:53:40

Oracle参数设置

2010-04-13 16:45:47

Oracle job

2010-09-25 10:11:19

无线局域网

2010-11-02 09:45:07

DB2 logfils

2012-01-11 11:28:00

JavaJVM

2009-11-16 14:42:32

路由器参数设置

2009-12-25 09:51:46

2010-09-27 10:08:36

无线局域网网络参数

2009-11-25 13:17:11

无线路由参数

2010-05-11 14:55:42

MySQL参数设置

2010-08-30 10:48:01

无线网络参数

2011-06-01 16:12:11

Android UI

2012-03-01 20:14:25

Android UI

2011-05-28 12:19:33

设计技巧UIAndroid

2011-03-02 13:41:34

Action BarDashboardAndroid用户界面

2009-12-03 20:11:47

路由器参数设置

2009-06-10 16:25:36

无线路由组网参数

2009-12-17 16:53:22

路由器协议
点赞
收藏

51CTO技术栈公众号