Android UI設(shè)計(jì):構(gòu)建應(yīng)用參數(shù)設(shè)置屏幕
原創(chuàng)【51CTO譯文】許多應(yīng)用程序可以得益于共享參數(shù)設(shè)置(Shared Preferences)——這是Android平臺解決應(yīng)用程序設(shè)置持久性存儲的辦法。有許多辦法可以創(chuàng)建UI用戶界面,用來為用戶收集和顯示持久性設(shè)置。最容易的辦法就是使用PreferencesActivity,它提供了與平臺的其余部分一致的外觀感覺,包括設(shè)備的系統(tǒng)參數(shù)設(shè)置。不妨通過該教程來學(xué)習(xí)如何使用PreferencesActivity。
我們簡單的Mobiletuts新聞源閱讀應(yīng)用程序還沒有一個(gè)正式名稱(我們一直稱之為TutList),它需要改進(jìn)針對后臺更新過程的用戶控制。因而,我們會添加一個(gè)參數(shù)設(shè)置,幫助控制后臺更新過程。
構(gòu)建應(yīng)用參數(shù)設(shè)置屏幕的UI設(shè)計(jì)準(zhǔn)備工作
不管怎樣,開始之前都要下載一個(gè)素材,并導(dǎo)入到Eclipse。
***步:添加UI設(shè)計(jì)共享參數(shù)設(shè)置助手
共享參數(shù)設(shè)置常常用在整個(gè)應(yīng)用程序當(dāng)中。關(guān)于單個(gè)設(shè)置的名稱和參數(shù)設(shè)置組的名稱的定義必須存儲起來,以便用在整個(gè)應(yīng)用程序當(dāng)中。有幾個(gè)辦法來解決這個(gè)問題。我們采用的解決辦法涉及一個(gè)輔助類(helper class),用于一致地訪問特定的設(shè)置值,而參數(shù)設(shè)置鍵存儲在資源字符串中,以便從代碼及其他資源文件來訪問。
不妨從輔助類代碼開始入手:
- 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();
- }
- }
在這個(gè)類中,我們定義了一個(gè)公共變量來確認(rèn)設(shè)置參數(shù)組或集的名稱,名為PREFS_NAME。我們還使用了名為pref_key_flag_background_update的資源字符串,指定特定的設(shè)置參數(shù)名稱定義。你應(yīng)該為自己的資源添加字符串,那樣可以定義該標(biāo)識符。我們把其值設(shè)為“background_update_flag”,但重要的是,所用的值在每個(gè)地方都是一樣的。
雖然我們添加了一個(gè)setBackgroundUpdateFlag()方法,以求全面,但不會使用這個(gè)方法。下文解釋了原因。
***,我們把這個(gè)Java類添加到了com.mamlambo.tutorial.tutlist.data程序包,因?yàn)槟莻€(gè)類似乎最有關(guān)系。
第二步:添加UI設(shè)計(jì)參數(shù)設(shè)置屏幕活動
Android軟件開發(fā)工具包(SDK)包括了一種一致的方法為用戶提供設(shè)置:PreferenceActivity。這個(gè)特殊的Activity(活動)類與參數(shù)設(shè)置資源文件一起,共同使得開發(fā)人員很容易一致地配置和顯示大多數(shù)類型的應(yīng)用設(shè)置。與其他應(yīng)用程序和系統(tǒng)參數(shù)設(shè)置屏幕相一致,也使得這些屏幕對用戶來說很熟悉、很容易。
想為“TutList”應(yīng)用程序添加PreferenceActivity,首先添加一個(gè)新的活動調(diào)用TutListPreferencesActivity,讓它擴(kuò)展PreferenceActivity(我們把它添加到主程序包)。由于我們沒有使用默認(rèn)的參數(shù)設(shè)置名稱,就需要設(shè)定這個(gè)PreferenceActivity將使用的參數(shù)設(shè)置名稱。此外,我們需要告訴它使用哪個(gè)參數(shù)設(shè)置資源文件。這將告訴它如何顯示參數(shù)設(shè)置,并且告訴它這個(gè)屏幕顯示和改動哪些參數(shù)設(shè)置。
在這個(gè)活動的onCreate()方法里面,使用setSharedPreferencesName()方法,參數(shù)設(shè)置組常量在我們在***步定義的參數(shù)設(shè)置輔助類中有所定義。然后調(diào)用addPreferencesFromResource()方法。我們會在下一步定義這個(gè)資源。
眼下,這整個(gè)類看起來像這樣:
- public class TutListPreferencesActivity extends PreferenceActivity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- getPreferenceManager().setSharedPreferencesName(
- TutListSharedPrefs.PREFS_NAME);
- addPreferencesFromResource(R.xml.prefs);
- }
- }
我們會在整個(gè)教程中改進(jìn)這個(gè)類。但首先,我們創(chuàng)建名為prefs的被引用XML資源。
第三步:定義UI設(shè)計(jì)參數(shù)設(shè)置屏幕資源
為應(yīng)用程序資源添加一個(gè)新的XML文件,名為prefs.xml。你可以使用新的Android XML文件向?qū)В顚懴鄳?yīng)字段,如下圖所示。這還會在正確的位置:/res/xml目錄創(chuàng)建XML文件。
參數(shù)設(shè)置活動資源文件包括 標(biāo)簽和一個(gè)或多個(gè)標(biāo)簽,后者用于組織設(shè)置和各種類型特定屬性。為了滿足我們簡單的參數(shù)設(shè)置要求,我們可以使用,它裝入并存儲布爾值。其他可能的類型包括EditTextPreference和ListPreference選擇,分別用于收集字符串以及從項(xiàng)目列表中進(jìn)行選擇。
下面是整個(gè)內(nèi)容參數(shù)設(shè)置屏幕資源文件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設(shè)計(jì)參數(shù)設(shè)置屏幕
下一步,我們將把菜單項(xiàng)添加到列表片段上,以啟動參數(shù)設(shè)置屏幕。在做這一步時(shí),我們還將更新刷新菜單項(xiàng),不再開始進(jìn)行預(yù)定更新。
為此,先編輯/res/menu/options_menu.xml資源文件,添加一個(gè)新的菜單項(xiàng):
- <item
- android:id="@+id/settings_option_item"
- android:icon="@drawable/ic_menu_preferences"
- android:title="@string/settings"></item>
你還需要為菜單項(xiàng)標(biāo)題(@string/settings)添加相應(yīng)的資源字符串,并添加一個(gè)相應(yīng)的圖標(biāo)(@drawable/ic_menu_preferences)。我們使用來自Android SDK的標(biāo)準(zhǔn)的參數(shù)設(shè)置圖標(biāo),該圖標(biāo)對用戶來說會很熟悉。
接下來,編輯onCreateOptionsMenu()方法,為新的菜單項(xiàng)提供正確的Intent:
- Intent prefsIntent = new Intent(getActivity().getApplicationContext(),
- TutListPreferencesActivity.class);
- MenuItem preferences = menu.findItem(R.id.settings_option_item);
- preferences.setIntent(prefsIntent);
現(xiàn)在,更新onOptionsItemSelected()方法。由于菜單項(xiàng)不止一個(gè),現(xiàn)在有必要使用開關(guān)語句。在該開關(guān)語句里面,我們可以使用為每個(gè)菜單項(xiàng)分配的常量標(biāo)識符,以區(qū)別用戶的選擇。
- 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" />
現(xiàn)在你可以運(yùn)行應(yīng)用程序,看到新的菜單項(xiàng)。
參數(shù)設(shè)置活動啟動后,可以存儲和檢索后臺更新參數(shù)設(shè)置。它應(yīng)該看起來如下:
看起來很好,但還沒有做實(shí)際的操作。雖然標(biāo)記在參數(shù)設(shè)置里面進(jìn)行更新,但還沒有地方來檢查值,看看要不要開始后臺更新。
第五步:開始和停止警報(bào)
在上一步,對setRecurringAlarm()輔助方法的調(diào)用已被刪除。實(shí)際上,這個(gè)方法在TutListFragment類中不再需要。而是把它移到TutListPreferencesActivity類。然后添加第二個(gè)輔助方法,名為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()方法;視情況需要,設(shè)置或取消循環(huán)警報(bào)。在這個(gè)方法里面,你可以使用輔助方法getBackgroundUpdateFlag()來檢查參數(shù)設(shè)置的值:更新的值,并調(diào)用相應(yīng)的方法:
- @Override
- ected void onPause() {
- super.onPause();
- Context context = getApplicationContext();
- if (TutListSharedPrefs.getBackgroundUpdateFlag(getApplicationContext())) {
- setRecurringAlarm(context);
- } else {
- cancelRecurringAlarm(context);
- }
現(xiàn)在,無論何時(shí)檢查設(shè)置,都可以根據(jù)當(dāng)前值來更新警報(bào)。由于默認(rèn)值是“off”,用戶必須進(jìn)入到設(shè)置,才能啟用后臺下載。
關(guān)于PreferenceFragment
你可能會想我們?yōu)槭裁床挥眯碌腜referenceFragment類。原因很簡單:它在兼容性庫中還沒有得到支持。由于我們想要讓TutList應(yīng)用程序不僅僅與Android 3.0設(shè)備兼容,所以我們還無法使用它。但愿兼容性庫會繼續(xù)得到改進(jìn)。
結(jié)論
在該教程中,大家學(xué)會了如何用PreferencesActivity使用PreferencesScreen資源文件,以便快速、輕松地創(chuàng)建一個(gè)功能活動,以便管理應(yīng)用程序的參數(shù)設(shè)置數(shù)據(jù)。此外,你為用戶提供了控制后臺更新TutList應(yīng)用程序的一個(gè)方法。