- Android Studio開發(fā)實戰(zhàn):從零基礎到App上線(第2版)
- 歐陽燊
- 2492字
- 2019-12-06 12:07:29
4.6 實戰(zhàn)項目:購物車
購物車的應用面很廣,凡是電商App都可以看到購物車的身影。本章以購物車為實戰(zhàn)項目,除了購物車使用廣泛的特點,還因為購物車用到多種存儲方式。現(xiàn)在我們開啟購物車的體驗之旅吧!
4.6.1 設計思路
先來看常見的購物車的外觀。第一次進入購物車頻道,購物車里面是空的,如圖4-25所示。接著去商品頻道選購手機,隨便挑幾款加入購物車,然后返回購物車,即可看到購物車里的商品列表,有商品圖片、名稱、數(shù)量、單價、總價等信息,如圖4-26所示。

圖4-25 空空如也的購物車

圖4-26 購物車的商品列表
購物車的存在感很強,并不僅僅在購物車頁面才能看到。往往在商場頻道,甚至某個商品詳情頁面,都會看到某個角落冒出一個購物車圖標。一旦有新商品加入購物車,購物車圖標上的商品數(shù)量就立馬加一。當然,用戶也可以點擊購物車圖標直接跳轉到購物車頁面。商品頻道除了商品列表外,頁面右上角還有一個購物車圖標,這個圖標有時在頁面右上角,有時又在頁面右下角,如圖4-27所示。商品詳情頁面通常也有購物車圖標,如果用戶在詳情頁面把商品加入購物車,那么圖標上的數(shù)字也會加一,如圖4-28所示。
現(xiàn)在看看購物車到底采取了哪些存儲方式。
- 數(shù)據(jù)庫SQLite:最直觀的是數(shù)據(jù)庫,購物車里的商品列表一定放在SQLite中,增刪改查都少不了SQLite。

圖4-27 手機商場的商品列表

圖4-28 商品詳情頁面
- 共享參數(shù)SharedPreferences:注意不同頁面的右上角購物車圖標都有數(shù)字,表示購物車中的商品數(shù)量,商品數(shù)量建議保存在共享參數(shù)中。因為每個頁面都要顯示商品數(shù)量,如果每次都到數(shù)據(jù)庫中執(zhí)行count操作,就會很消耗資源。因為商品數(shù)量需要持久地存儲,所以不適合放在全局內(nèi)存中,不然下次啟動App時,內(nèi)存中的變量又從0開始。
- SD卡文件:通常情況下,商品圖片來自于電商平臺的服務器,這年頭流量是很寶貴的,可是圖片恰恰很耗流量(尤其是大圖)。從用戶的錢包著想,App得把下載的圖片保存在SD卡中。這樣一來,下次用戶訪問商品詳情頁面時,App便能直接從SD卡獲取商品圖片,不但不花流量而且加快瀏覽速度,一舉兩得。
- 全局內(nèi)存:訪問SD卡的圖片文件固然是個好主意,然而商品頻道、購物車頻道等可能在一個頁面展示多張商品小圖,如果每張小圖都要訪問SD卡,頻繁的SD卡讀寫操作也很耗資源。更好的辦法是把商品小圖加載進全局內(nèi)存,這樣直接從內(nèi)存中獲取圖片,高效又快速。之所以不把商品大圖放入全局內(nèi)存,是因為大圖很耗空間,一不小心就會占用幾十兆內(nèi)存。
不找不知道,一找嚇一跳,原來購物車用到了這么多種存儲方式。
4.6.2 小知識:菜單Menu
之前的章節(jié)在進行某項控制操作時一般由按鈕控件觸發(fā)。如果頁面上需要支持多個控制操作,比如去商場購物、清空購物車、查看商品詳情、刪除指定商品等,就得在頁面上添加多個按鈕。如此一來,App頁面顯得雜亂無章,滿屏按鈕既礙眼又不便操作。這時,就可以使用菜單控件。
菜單無論在哪里都是常用控件,Android的菜單主要分兩種,一種是選項菜單OptionMenu,通過按菜單鍵或點擊事件觸發(fā),對應Windows上的開始菜單;另一種是上下文菜單ContextMenu,通過長按事件觸發(fā),對應Windows上的右鍵菜單。無論是哪種菜單,都有對應的菜單布局文件,就像每個活動頁面都有一個布局文件一樣。不同的是頁面的布局文件放在res/layout目錄下,菜單的布局文件放在res/menu目錄下。
下面來看Android的選項菜單和上下文菜單。
1. 選項菜單OptionMenu
彈出選項菜單的途徑有3種:
(1)按菜單鍵。
(2)在代碼中手動打開選項菜單,即調(diào)用openOptionsMenu方法。
(3)按工具欄右側的溢出菜單按鈕,這個在第7章介紹工具欄時進行介紹。
實現(xiàn)選項菜單的功能需要重寫以下兩種方法。
- onCreateOptionsMenu:在頁面打開時調(diào)用。需要指定菜單列表的XML文件。
- onOptionsItemSelected:在列表的菜單項被選中時調(diào)用。需要對不同的菜單項做分支處理。
下面是菜單布局文件的代碼,很簡單,就是menu與item的組合排列:

接下來是使用選項菜單的代碼片段:

按菜單鍵和調(diào)用openOptionsMenu方法彈出的選項菜單都是在頁面下方,如圖4-29所示。

圖4-29 選項菜單的菜單列表
2. 上下文菜單ContextMenu
彈出上下文菜單的途徑有兩種:
(1)默認在某個控件被長按時彈出。通常在onStart函數(shù)中加入registerForContextMenu方法為指定控件注冊上下文菜單,在onStop函數(shù)中加入unregisterForContextMenu方法為指定控件注銷上下文菜單。
(2)在除長按事件之外的其他事件中打開上下文菜單。先執(zhí)行registerForContextMenu方法注冊菜單,然后執(zhí)行openContextMenu方法打開菜單,最后執(zhí)行unregisterForContextMenu方法注銷菜單。
實現(xiàn)上下文菜單的功能需要重寫以下兩種方法。
- onCreateContextMenu:在此指定菜單列表的XML文件,作為上下文菜單列表項的來源。
- onContextItemSelected:在此對不同的菜單項做分支處理。
上下文菜單的布局文件格式同選項菜單,下面是使用上下文菜單的代碼片段:

上下文菜單的菜單列表固定顯示在頁面中部,菜單外的其他頁面區(qū)域顏色會變深,具體效果如圖4-30所示。

圖4-30 上下文菜單的菜單列表
4.6.3 代碼示例
這一章的編碼開始有些復雜了,不但有各種控件和布局的操作,還有4種存儲方式的使用,再加上Activity與Application兩大組件的運用,已然是一個正規(guī)App的雛形。
編碼過程分為4步(增加的一步是對AndroidManifest.xml認真配置):
步驟01 想好代碼文件與布局文件的名稱,比如購物車頁面的代碼文件取名ShoppingCartActivity.java,對應的布局文件名是activity_shopping_cart.xml;商場頻道頁面的代碼文件取名ShoppingChannelActivity.java,對應的布局文件名是activity_shopping_channel.xml;商品詳情頁面的代碼文件取名ShoppingDetailActivity,對應的布局文件名是activity_shopping_detail.xml;另有一個全局應用的代碼文件MainApplication.java。
步驟02 在AndroidManifest.xml中補充相應配置,主要有以下3點:
(1)注冊3個頁面的acitivity節(jié)點,注冊代碼如下:
<activity android:name=".ShoppingCartActivity" android:theme="@style/AppBaseTheme" /> <activity android:name=".ShoppingChannelActivity" /> <activity android:name=".ShoppingDetailActivity" />
(2)給application補充name屬性,值為MainApplication,舉例如下:
android:name=".MainApplication"
(3)聲明SD卡的操作權限,主要補充下面3行權限配置:
<!-- SD卡讀寫權限 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAG" /> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
步驟03 res目錄下的XML文件編寫也多了起來,主要工作包括:
(1)在res/layout目錄下創(chuàng)建布局文件activity_shopping_cart.xml、activity_shopping_channel.xml、activity_shopping_detail.xml,分別根據(jù)頁面效果圖編寫3個頁面的布局定義文件。
(2)在res/menu目錄下創(chuàng)建菜單布局文件menu_cart.xml和menu_goods.xml,分別用于購物車的選項菜單和商品項的上下文菜單。
(3)在values/styles.xml中補充下面的樣式定義,給不帶導航欄的購物車頁面使用:
<style name="AppBaseTheme" parent="Theme.AppCompat.Light" />
步驟04 在項目的包名目錄下創(chuàng)建類MainApplication、ShoppingCartActivity、ShoppingChannelActivity和ShoppingDetailActivity,并填入具體的控件操作與業(yè)務邏輯代碼。
購物車項目的完整代碼參見本書附錄源碼storage模塊的ShoppingCartActivity.java、ShoppingChannelActivity.java和ShoppingDetailActivity.java。下面列出兩塊與存儲技術有關的代碼片段,首先是商場頁面把商品加入購物車的邏輯處理,主要涉及到共享參數(shù)和SQLite數(shù)據(jù)庫的運用,關鍵代碼如下所示:

然后是購物車頁面模擬從網(wǎng)絡上下載商品圖片,并構建簡單的圖片緩存機制的邏輯處理,主要涉及到SD卡文件操作與Application全局變量的運用,關鍵代碼如下所示:
