Android從入門到精通(項(xiàng)目篇)_第1頁(yè)
Android從入門到精通(項(xiàng)目篇)_第2頁(yè)
Android從入門到精通(項(xiàng)目篇)_第3頁(yè)
Android從入門到精通(項(xiàng)目篇)_第4頁(yè)
Android從入門到精通(項(xiàng)目篇)_第5頁(yè)
已閱讀5頁(yè),還剩93頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

Android從入門到精通\h第3篇項(xiàng)目實(shí)戰(zhàn)篇目錄\h第3篇項(xiàng)目實(shí)戰(zhàn)篇\h第15章基于Android的家庭理財(cái)通\h15.1系統(tǒng)分析\h15.2系統(tǒng)設(shè)計(jì)\h15.3系統(tǒng)開發(fā)及運(yùn)行環(huán)境\h15.4數(shù)據(jù)庫(kù)與數(shù)據(jù)表設(shè)計(jì)\h15.5創(chuàng)建項(xiàng)目\h15.6系統(tǒng)文件夾組織結(jié)構(gòu)\h15.7公共類設(shè)計(jì)\h15.8登錄模塊設(shè)計(jì)\h15.9系統(tǒng)主窗體設(shè)計(jì)\h15.10收入管理模塊設(shè)計(jì)\h15.11便簽管理模塊設(shè)計(jì)\h15.12系統(tǒng)設(shè)置模塊設(shè)計(jì)\h15.13運(yùn)行項(xiàng)目\h15.14將程序安裝到Android手機(jī)上\h15.15開發(fā)中常見問題與解決方法\h15.16小結(jié)第3篇項(xiàng)目實(shí)戰(zhàn)篇本篇通過一個(gè)完整的家庭理財(cái)通實(shí)例,運(yùn)用軟件工程的設(shè)計(jì)思想,講解如何進(jìn)行Android桌面應(yīng)用程序的開發(fā)。實(shí)例按照“系統(tǒng)分析→系統(tǒng)設(shè)計(jì)→系統(tǒng)開發(fā)及運(yùn)行環(huán)境→數(shù)據(jù)庫(kù)與數(shù)據(jù)表設(shè)計(jì)→創(chuàng)建項(xiàng)目→系統(tǒng)文件夾組織結(jié)構(gòu)→公共類設(shè)計(jì)→登錄模塊設(shè)計(jì)→系統(tǒng)主窗體設(shè)計(jì)→收入管理模塊設(shè)計(jì)→便簽管理模塊設(shè)計(jì)→系統(tǒng)設(shè)置模塊設(shè)計(jì)→運(yùn)行項(xiàng)目→將程序安裝到Android手機(jī)上”的流程進(jìn)行介紹,帶領(lǐng)讀者一步一步親身體驗(yàn)開發(fā)項(xiàng)目的全過程。第15章基于Android的家庭理財(cái)通(教學(xué)錄像:51分鐘)隨著3G智能手機(jī)的迅速普及,移動(dòng)互聯(lián)網(wǎng)離我們?cè)絹?lái)越近,由互聯(lián)網(wǎng)巨頭Google推出的免費(fèi)手機(jī)平臺(tái)Android,已經(jīng)得到眾多廠商和開發(fā)者的擁護(hù),而隨著Android手機(jī)操作系統(tǒng)的大熱,基于Android的軟件也越來(lái)越受到廣大用戶的歡迎。本章將使用Android4.0技術(shù)開發(fā)一個(gè)家庭理財(cái)通系統(tǒng),通過該系統(tǒng),可以隨時(shí)隨地記錄用戶的收入及支出等信息。通過閱讀本章,您可以:★熟悉軟件的開發(fā)流程

★掌握Android布局文件的設(shè)計(jì)

★掌握SQLite數(shù)據(jù)庫(kù)的使用

★掌握公共類的設(shè)計(jì)及使用

★掌握如何在Android程序中操作SQLite數(shù)據(jù)庫(kù)

★掌握如何將Android程序安裝到Android手機(jī)上15.1系統(tǒng)分析教學(xué)錄像:光盤\TM\lx\15\系統(tǒng)分析.exe15.1.1需求分析你是“月光族”嗎?你能說出每月的錢都用到什么地方了嗎?為了更好地記錄您每月的收入及支出情況,這里開發(fā)了一款基于Android系統(tǒng)的家庭理財(cái)通軟件。通過該軟件,用戶可以隨時(shí)隨地記錄自己的收入、支出等信息;另外,為了保護(hù)自己的隱私,還可以為家庭理財(cái)通軟件設(shè)置密碼。15.1.2可行性分析根據(jù)《GB8567-88計(jì)算機(jī)軟件產(chǎn)品開發(fā)文件編制指南》中可行性分析的要求,制定可行性研究報(bào)告如下。1.引言(1)編寫目的為了給軟件開發(fā)企業(yè)的決策層提供是否實(shí)施項(xiàng)目的參考依據(jù),現(xiàn)以文件的形式分析項(xiàng)目的風(fēng)險(xiǎn)、需要的投資與效益。(2)背景為了更好地記錄用戶每月的收入及支出詳細(xì)情況,現(xiàn)委托其他公司開發(fā)一款個(gè)人記賬相關(guān)的軟件,項(xiàng)目名稱為“家庭理財(cái)通”。2.可行性研究的前提(1)要求[√]系統(tǒng)的功能符合用戶的實(shí)際情況。

[√]可方便地對(duì)收入及支出情況進(jìn)行增、刪、改、查等操作。

[√]系統(tǒng)的功能操作要方便、易懂,不要有多余或復(fù)雜的操作。

[√]保證軟件的安全性。說明:在開發(fā)項(xiàng)目時(shí),明確項(xiàng)目的需求是十分重要的,需求就是項(xiàng)目要實(shí)現(xiàn)的目的。例如,我要去醫(yī)院買藥,去醫(yī)院只是一個(gè)過程,好比是編寫的程序代碼,目的是去買藥(需求)。(2)目標(biāo)方便對(duì)個(gè)人的收入及支出等信息進(jìn)行管理。(3)評(píng)價(jià)尺度項(xiàng)目需要在一個(gè)月內(nèi)交付用戶使用,系統(tǒng)分析人員需要3天內(nèi)到位,用戶需要2天時(shí)間確認(rèn)需求分析文檔,去除其中可能出現(xiàn)的問題,如用戶可能臨時(shí)有事,占用5天時(shí)間確認(rèn)需求分析,那么程序開發(fā)人員需要在25天的時(shí)間內(nèi)進(jìn)行系統(tǒng)設(shè)計(jì)、程序編碼、系統(tǒng)測(cè)試、程序調(diào)試和安裝部署工作,其間,還包括了員工每周的休息時(shí)間。3.投資及效益分析(1)支出根據(jù)預(yù)算,公司計(jì)劃投入3個(gè)人,為此需要支付1.5萬(wàn)元的工資及各種福利待遇;項(xiàng)目的安裝、調(diào)試以及用戶培訓(xùn)等費(fèi)用支出需要5千元;項(xiàng)目后期維護(hù)階段預(yù)計(jì)需要投入5千元,項(xiàng)目累計(jì)投入2.5萬(wàn)元。(2)收益客戶提供項(xiàng)目開發(fā)資金5萬(wàn)元,對(duì)于項(xiàng)目后期進(jìn)行的改動(dòng),采取協(xié)商的原則,根據(jù)改動(dòng)規(guī)模額外提供資金。因此,從投資與收益的效益比上,公司大致可以獲得2.5萬(wàn)元的利潤(rùn)。項(xiàng)目完成后,會(huì)給公司提供資源儲(chǔ)備,包括技術(shù)、經(jīng)驗(yàn)的積累。4.結(jié)論根據(jù)上面的分析,在技術(shù)上不會(huì)存在問題,因此項(xiàng)目延期的可能性很小;在效益上,公司投入3個(gè)人、一個(gè)月的時(shí)間獲利2.5萬(wàn)元,比較可觀;另外,公司還可以儲(chǔ)備項(xiàng)目開發(fā)的經(jīng)驗(yàn)和資源。因此,認(rèn)為該項(xiàng)目可以開發(fā)。15.1.3編寫項(xiàng)目計(jì)劃書根據(jù)《GB8567-88計(jì)算機(jī)軟件產(chǎn)品開發(fā)文件編制指南》中的項(xiàng)目開發(fā)計(jì)劃要求,結(jié)合單位實(shí)際情況,設(shè)計(jì)項(xiàng)目計(jì)劃書如下。1.引言(1)編寫目的為了能使項(xiàng)目按照合理的順序開展,并保證按時(shí)、高質(zhì)量地完成,現(xiàn)擬訂項(xiàng)目計(jì)劃書,將項(xiàng)目開發(fā)生命周期中的任務(wù)范圍、團(tuán)隊(duì)組織結(jié)構(gòu)、團(tuán)隊(duì)成員的工作任務(wù)、團(tuán)隊(duì)內(nèi)外溝通協(xié)作方式、開發(fā)進(jìn)度、檢查項(xiàng)目工作等內(nèi)容描述出來(lái),作為項(xiàng)目相關(guān)人員之間的共識(shí)、約定以及項(xiàng)目生命周期內(nèi)的所有項(xiàng)目活動(dòng)的行動(dòng)基礎(chǔ)。(2)背景家庭理財(cái)通是本公司與王××簽訂的待開發(fā)項(xiàng)目,項(xiàng)目性質(zhì)為個(gè)人記賬類型,可以方便地記錄用戶的收入、支出等信息,項(xiàng)目周期為一個(gè)月。項(xiàng)目背景規(guī)劃如表15.1所示。表15.1項(xiàng)目背景規(guī)劃2.概述(1)項(xiàng)目目標(biāo)項(xiàng)目應(yīng)當(dāng)符合SMART原則,把項(xiàng)目要完成的工作用清晰的語(yǔ)言描述出來(lái)?!凹彝ダ碡?cái)通”項(xiàng)目的主要目標(biāo)是為用戶提供一套能夠方便地管理個(gè)人收入及支出信息的軟件。(2)應(yīng)交付成果項(xiàng)目開發(fā)完成后,交付的內(nèi)容如下。[√]以光盤的形式提供家庭理財(cái)通的源程序、apk安裝文件和系統(tǒng)使用說明書。

[√]系統(tǒng)發(fā)布后,進(jìn)行6個(gè)月的無(wú)償維護(hù)和服務(wù),超過6個(gè)月進(jìn)行系統(tǒng)有償維護(hù)與服務(wù)。(3)項(xiàng)目開發(fā)環(huán)境開發(fā)本項(xiàng)目所用的操作系統(tǒng)可以是Windows或者Linux,開發(fā)工具為Eclipse+Android4.0,數(shù)據(jù)庫(kù)采用Android自帶的SQLite3。(4)項(xiàng)目驗(yàn)收方式與依據(jù)項(xiàng)目驗(yàn)收分為內(nèi)部驗(yàn)收和外部驗(yàn)收兩種方式。項(xiàng)目開發(fā)完成后,首先進(jìn)行內(nèi)部驗(yàn)收,由測(cè)試人員根據(jù)用戶需求和項(xiàng)目目標(biāo)進(jìn)行驗(yàn)收。在通過內(nèi)部驗(yàn)收后,交給客戶進(jìn)行外部驗(yàn)收,驗(yàn)收的主要依據(jù)為需求規(guī)格說明書。3.項(xiàng)目團(tuán)隊(duì)組織本公司針對(duì)該項(xiàng)目組建了一個(gè)由軟件工程師、界面設(shè)計(jì)師和測(cè)試人員構(gòu)成的開發(fā)團(tuán)隊(duì),為了明確項(xiàng)目團(tuán)隊(duì)中每個(gè)人的任務(wù)分工,現(xiàn)制定人員分工表,如表15.2所示。表15.2人員分工表15.2系統(tǒng)設(shè)計(jì)教學(xué)錄像:光盤\TM\lx\15\系統(tǒng)設(shè)計(jì).exe15.2.1系統(tǒng)目標(biāo)根據(jù)用戶對(duì)家庭理財(cái)通軟件的要求,制定目標(biāo)如下:[√]操作簡(jiǎn)單方便,界面簡(jiǎn)潔美觀。

[√]方便地對(duì)收入及支出信息進(jìn)行增、刪、改、查等操作。

[√]通過便簽方便地記錄用戶的計(jì)劃。

[√]能夠通過設(shè)置密碼保證程序的安全性。

[√]系統(tǒng)運(yùn)行穩(wěn)定、安全可靠。15.2.2系統(tǒng)功能結(jié)構(gòu)家庭理財(cái)通軟件的功能結(jié)構(gòu)如圖15.1所示。圖15.1家庭理財(cái)通功能結(jié)構(gòu)圖15.2.3系統(tǒng)業(yè)務(wù)流程家庭理財(cái)通軟件的業(yè)務(wù)流程如圖15.2所示。圖15.2家庭理財(cái)通業(yè)務(wù)流程圖注意:在制作項(xiàng)目前,必須根據(jù)其實(shí)現(xiàn)目標(biāo)制作業(yè)務(wù)流程圖。15.2.4系統(tǒng)編碼規(guī)范開發(fā)應(yīng)用程序常常需要通過團(tuán)隊(duì)合作來(lái)完成,每個(gè)人負(fù)責(zé)不同的業(yè)務(wù)模塊,為了使程序的結(jié)構(gòu)與代碼風(fēng)格統(tǒng)一標(biāo)準(zhǔn)化,增加代碼的可讀性,需要在編碼之前制定一套統(tǒng)一的編碼規(guī)范。下面介紹家庭理財(cái)通系統(tǒng)開發(fā)中的編碼規(guī)范。1.數(shù)據(jù)庫(kù)命名規(guī)范(1)數(shù)據(jù)庫(kù)數(shù)據(jù)庫(kù)以數(shù)據(jù)庫(kù)相關(guān)英文單詞或縮寫進(jìn)行命名,如表15.3所示。表15.3數(shù)據(jù)庫(kù)命名

數(shù)據(jù)庫(kù)名稱描述account.db家庭理財(cái)通數(shù)據(jù)庫(kù)(2)數(shù)據(jù)表數(shù)據(jù)表名稱以字母tb開頭(小寫),后面加數(shù)據(jù)表相關(guān)英文單詞或縮寫,如表15.4所示。表15.4數(shù)據(jù)表命名

數(shù)據(jù)庫(kù)名稱描述tb_outaccount支出信息表(3)字段字段一率采用英文單詞或詞組(可利用翻譯軟件)命名,如找不到專業(yè)的英文單詞或詞組,可以用相同意義的英文單詞或詞組代替,如表15.5所示。表15.5字段命名

字段名稱描述_id編號(hào)money金額說明:在數(shù)據(jù)庫(kù)中使用命名規(guī)范,有助于其他用戶更好地理解數(shù)據(jù)表及其中各字段的內(nèi)容。2.程序代碼命名規(guī)范(1)數(shù)據(jù)類型簡(jiǎn)寫規(guī)則程序中定義常量、變量或方法等內(nèi)容時(shí),常常需要指定類型。下面介紹一種常見的數(shù)據(jù)類型簡(jiǎn)寫規(guī)則,如表15.6所示。表15.6數(shù)據(jù)類型簡(jiǎn)寫規(guī)則

數(shù)據(jù)類型簡(jiǎn)寫整型int字符串str布爾型bl單精度浮點(diǎn)型flt雙精度浮點(diǎn)型dbl(2)組件命名規(guī)則所有的組件對(duì)象名稱都為組件名稱的拼音簡(jiǎn)寫,出現(xiàn)沖突時(shí)可采用不同的簡(jiǎn)寫規(guī)則。組件命名規(guī)則如表15.7所示。表15.7組件命名規(guī)則

組件縮寫形式EditTexttxtButtonbtnSpinnerspListViewlv……說明:在項(xiàng)目中使用良好的命名規(guī)則,有助于開發(fā)者快速了解變量、方法、類、窗體以及各組件的用處。15.3系統(tǒng)開發(fā)及運(yùn)行環(huán)境教學(xué)錄像:光盤\TM\lx\15\系統(tǒng)開發(fā)及運(yùn)行環(huán)境.exe本系統(tǒng)的軟件開發(fā)及運(yùn)行環(huán)境具體如下。[√]操作系統(tǒng):Windows7。

[√]JDK環(huán)境:JavaSEDevelopmentKET(JDK)version6。

[√]開發(fā)工具:Eclipse3.7.1+Android4.0。

[√]開發(fā)語(yǔ)言:Java、XML。

[√]數(shù)據(jù)庫(kù)管理軟件:SQLite3。

[√]運(yùn)行平臺(tái):Windows、Linux各版本。

[√]分辨率:最佳效果1024×768像素。15.4數(shù)據(jù)庫(kù)與數(shù)據(jù)表設(shè)計(jì)教學(xué)錄像:光盤\TM\lx\15\數(shù)據(jù)庫(kù)與數(shù)據(jù)表設(shè)計(jì).exe開發(fā)應(yīng)用程序時(shí),對(duì)數(shù)據(jù)庫(kù)的操作是必不可少的,數(shù)據(jù)庫(kù)設(shè)計(jì)是根據(jù)程序的需求及其實(shí)現(xiàn)功能所制定的,數(shù)據(jù)庫(kù)設(shè)計(jì)的合理性將直接影響程序的開發(fā)過程。15.4.1數(shù)據(jù)庫(kù)分析家庭理財(cái)通是一款運(yùn)行在Android系統(tǒng)上的程序,在Android系統(tǒng)中,集成了一種輕量型的數(shù)據(jù)庫(kù),即SQLite,該數(shù)據(jù)庫(kù)是使用C語(yǔ)言編寫的開源嵌入式數(shù)據(jù)庫(kù),支持的數(shù)據(jù)庫(kù)大小為2TB,使用該數(shù)據(jù)庫(kù),可以像使用SQLServer數(shù)據(jù)庫(kù)或者Oracle數(shù)據(jù)庫(kù)那樣來(lái)存儲(chǔ)、管理和維護(hù)數(shù)據(jù)。本系統(tǒng)采用了SQLite數(shù)據(jù)庫(kù),并且命名為account.db,該數(shù)據(jù)庫(kù)中用到了4個(gè)數(shù)據(jù)表,分別是tb_flag、tb_inaccount、tb_outaccount和tb_pwd,如圖15.3所示。圖15.3家庭理財(cái)通系統(tǒng)中用到的數(shù)據(jù)表15.4.2創(chuàng)建數(shù)據(jù)庫(kù)家庭理財(cái)通系統(tǒng)在創(chuàng)建數(shù)據(jù)庫(kù)時(shí),是通過使用SQLiteOpenHelper類的構(gòu)造函數(shù)來(lái)實(shí)現(xiàn)的,實(shí)現(xiàn)代碼如下:privatestaticfinalintVERSION=1;//定義數(shù)據(jù)庫(kù)版本號(hào)

privatestaticfinalStringDBNAME="account.db";//定義數(shù)據(jù)庫(kù)名

publicDBOpenHelper(Contextcontext)//定義構(gòu)造函數(shù)

{

super(context,DBNAME,null,VERSION);//重寫基類的構(gòu)造函數(shù),以創(chuàng)建數(shù)據(jù)庫(kù)

}技巧:創(chuàng)建數(shù)據(jù)庫(kù)時(shí),也可以在cmd命令窗口中使用sqlite3命令打開SQLite數(shù)據(jù)庫(kù),然后使用createdatabase語(yǔ)句創(chuàng)建,但這里需要注意的是,在cmd命令窗口中操作SQLite數(shù)據(jù)庫(kù)時(shí),SQL語(yǔ)句最后需要加分號(hào)“;”。15.4.3創(chuàng)建數(shù)據(jù)表在創(chuàng)建數(shù)據(jù)表前,首先要根據(jù)項(xiàng)目實(shí)際要求規(guī)劃相關(guān)的數(shù)據(jù)表結(jié)構(gòu),然后在數(shù)據(jù)庫(kù)中創(chuàng)建相應(yīng)的數(shù)據(jù)表。(1)tb_pwd(密碼信息表)tb_pwd表用于保存家庭理財(cái)通系統(tǒng)的密碼信息,該表的結(jié)構(gòu)如表15.8所示。表15.8密碼信息表

字段名數(shù)據(jù)類型是否主鍵描述passwordvarchar(20)否用戶密碼(2)tb_outaccount(支出信息表)tb_outaccount表用于保存用戶的支出信息,該表的結(jié)構(gòu)如表15.9所示。表15.9支出信息表

字段名數(shù)據(jù)類型是否主鍵描述_idinteger是編號(hào)moneydecimal否支出金額timevarchar(10)否支出時(shí)間typevarchar(10)否支出類別addressvarchar(100)否支出地點(diǎn)markvarchar(200)否備注(3)tb_inaccount(收入信息表)tb_inaccount表用于保存用戶的收入信息,該表的結(jié)構(gòu)如表15.10所示。表15.10收入信息表

字段名數(shù)據(jù)類型是否主鍵描述_idinteger是編號(hào)moneydecimal否收入金額timevarchar(10)否收入時(shí)間typevarchar(10)否收入類別handlervarchar(100)否付款方markvarchar(200)否備注(4)tb_flag(便簽信息表)tb_flag表用于保存家庭理財(cái)通系統(tǒng)的便簽信息,該表的結(jié)構(gòu)如表15.11所示。表15.11便簽信息表

字段名數(shù)據(jù)類型是否主鍵描述_idinteger是編號(hào)flagvarchar(200)否便簽內(nèi)容15.5創(chuàng)建項(xiàng)目教學(xué)錄像:光盤\TM\lx\15\創(chuàng)建項(xiàng)目.exe家庭理財(cái)通系統(tǒng)的項(xiàng)目名稱為AccountMS,該項(xiàng)目是使用Eclipse+Android4.0開發(fā)的,在Eclipse開發(fā)環(huán)境中創(chuàng)建該項(xiàng)目的步驟如下:(1)啟動(dòng)Eclipse,單擊工具欄中的按鈕,或者在菜單欄中依次選擇“文件”/“新建”/AndroidProject命令,如圖15.4所示。如果“新建”菜單中沒有AndroidProject子菜單,則選擇“新建”/“其他”命令,在彈出的“新建”窗口中展開Android節(jié)點(diǎn),選擇AndroidProject節(jié)點(diǎn),如圖15.5所示,然后單擊“下一步”按鈕。

圖15.4選擇菜單命令圖15.5“新建”窗口(2)彈出NewAndroidProject窗口,在該窗口中,首先輸入項(xiàng)目名稱AccountMS,并選擇項(xiàng)目存放路徑,如圖15.6所示,然后單擊“下一步”按鈕,進(jìn)入SelectBuildTarget界面,從中選擇Android版本,如圖15.7所示。

圖15.6輸入項(xiàng)目名稱和存放路徑圖15.7選擇Android版本(3)單擊“下一步”按鈕,進(jìn)入ApplicationInfo界面,在PackageName文本框中輸入包名,這里輸入com.xiaoke.accountsoft.activity,其他采用默認(rèn)設(shè)置,如圖15.8所示。圖15.8ApplicationInfo界面(4)單擊“完成”按鈕,這樣即可創(chuàng)建AccountMS項(xiàng)目。15.6系統(tǒng)文件夾組織結(jié)構(gòu)教學(xué)錄像:光盤\TM\lx\15\系統(tǒng)文件夾組織結(jié)構(gòu).exe在編寫項(xiàng)目代碼之前,需要制定好項(xiàng)目的系統(tǒng)文件夾組織結(jié)構(gòu),如不同的Java包存放不同的窗體、公共類、數(shù)據(jù)模型、工具類或者圖片資源等,這樣不但可以保證團(tuán)隊(duì)開發(fā)的一致性,也可以規(guī)范系統(tǒng)的整體架構(gòu)。創(chuàng)建完系統(tǒng)中可能用到的文件夾或者Java包之后,在開發(fā)時(shí),只需將創(chuàng)建的類文件或者資源文件保存到相應(yīng)的文件夾中即可。家庭理財(cái)通系統(tǒng)的文件夾組織結(jié)構(gòu)如圖15.9所示。圖15.9文件夾組織結(jié)構(gòu)說明:從圖15.9可以看出,res和assets文件夾都用來(lái)存放資源文件,但在實(shí)際開發(fā)時(shí),Android不為assets文件夾下的資源文件生成ID,用戶需要通過AssetManager類以文件路徑和文件名的方式來(lái)訪問assets文件夾中的文件。15.7公共類設(shè)計(jì)教學(xué)錄像:光盤\TM\lx\15\公共類設(shè)計(jì).exe公共類是代碼重用的一種形式,它將各個(gè)功能模塊經(jīng)常調(diào)用的方法提取到公用的Java類中,例如,訪問數(shù)據(jù)庫(kù)的Dao類容納了所有訪問數(shù)據(jù)庫(kù)的方法,并同時(shí)管理著數(shù)據(jù)庫(kù)的連接、關(guān)閉等內(nèi)容。使用公共類,不但實(shí)現(xiàn)了項(xiàng)目代碼的重用,還提供了程序性能和代碼的可讀性。本節(jié)將介紹家庭理財(cái)通系統(tǒng)中的公共類設(shè)計(jì)。15.7.1數(shù)據(jù)模型公共類在com.xiaoke.accountsoft.model包中存放的是數(shù)據(jù)模型公共類,它們對(duì)應(yīng)著數(shù)據(jù)庫(kù)中不同的數(shù)據(jù)表,這些模型將被訪問數(shù)據(jù)庫(kù)的Dao類和程序中各個(gè)模塊甚至各個(gè)組件所使用。數(shù)據(jù)模型是對(duì)數(shù)據(jù)表中所有字段的封裝,主要用于存儲(chǔ)數(shù)據(jù),并通過相應(yīng)的getXXX()和setXXX()方法實(shí)現(xiàn)不同屬性的訪問原則。現(xiàn)在以收入信息表為例,介紹它所對(duì)應(yīng)的數(shù)據(jù)模型類的實(shí)現(xiàn)代碼,主要代碼如下:packagecom.xiaoke.accountsoft.model;

publicclassTb_inaccount//收入信息實(shí)體類

{

privateint_id;//存儲(chǔ)收入編號(hào)

privatedoublemoney;//存儲(chǔ)收入金額

privateStringtime;//存儲(chǔ)收入時(shí)間

privateStringtype;//存儲(chǔ)收入類別

privateStringhandler;//存儲(chǔ)收入付款方

privateStringmark;//存儲(chǔ)收入備注

publicTb_inaccount()//默認(rèn)構(gòu)造函數(shù)

{

super();

}

//定義有參構(gòu)造函數(shù),用來(lái)初始化收入信息實(shí)體類中的各個(gè)字段

publicTb_inaccount(intid,doublemoney,Stringtime,Stringtype,Stringhandler,Stringmark)

{

super();

this._id=id;//為收入編號(hào)賦值

this.money=money;//為收入金額賦值

this.time=time;//為收入時(shí)間賦值

this.type=type;//為收入類別賦值

this.handler=handler;//為收入付款方賦值

this.mark=mark;//為收入備注賦值

}

publicintgetid()//設(shè)置收入編號(hào)的可讀屬性

{

return_id;

}

publicvoidsetid(intid)//設(shè)置收入編號(hào)的可寫屬性

{

this._id=id;

}

publicdoublegetMoney()//設(shè)置收入金額的可讀屬性

{

returnmoney;

}

publicvoidsetMoney(doublemoney)//設(shè)置收入金額的可寫屬性

{

this.money=money;

}

publicStringgetTime()//設(shè)置收入時(shí)間的可讀屬性

{

returntime;

}

publicvoidsetTime(Stringtime)//設(shè)置收入時(shí)間的可寫屬性

{

this.time=time;

}

publicStringgetType()//設(shè)置收入類別的可讀屬性

{

returntype;

}

publicvoidsetType(Stringtype)//設(shè)置收入類別的可寫屬性

{

this.type=type;

}

publicStringgetHandler()//設(shè)置收入付款方的可讀屬性

{

returnhandler;

}

publicvoidsetHandler(Stringhandler)//設(shè)置收入付款方的可寫屬性

{

this.handler=handler;

}

publicStringgetMark()//設(shè)置收入備注的可讀屬性

{

returnmark;

}

publicvoidsetMark(Stringmark)//設(shè)置收入備注的可寫屬性

{

this.mark=mark;

}

}其他數(shù)據(jù)模型類的定義與收入數(shù)據(jù)模型類的定義方法類似,其屬性內(nèi)容就是數(shù)據(jù)表中相應(yīng)的字段。com.xiaoke.accountsoft.model包中包含的數(shù)據(jù)模型類如表15.12所示。表15.12com.xiaoke.accountsoft.model包中的數(shù)據(jù)模型類

類名說明Tb_flag便簽信息數(shù)據(jù)表模型類Tb_inaccount收入信息數(shù)據(jù)表模型類Tb_outaccount支出信息數(shù)據(jù)表模型類Tb_pwd密碼信息數(shù)據(jù)表模型類說明:表15.12中的所有模型類都定義了對(duì)應(yīng)數(shù)據(jù)表字段的屬性,并提供了訪問相應(yīng)屬性的getXXX()和setXXX()方法。15.7.2Dao公共類Dao的全稱是DataAccessObject,即數(shù)據(jù)訪問對(duì)象,本系統(tǒng)中創(chuàng)建了com.xiaoke.accountsoft.dao包,該包中包含DBOpenHelper、FlagDAO、InaccountDAO、OutaccountDAO和PwdDAO5個(gè)數(shù)據(jù)訪問類,其中,DBOpenHelper類用來(lái)實(shí)現(xiàn)創(chuàng)建數(shù)據(jù)庫(kù)、數(shù)據(jù)表等功能;FlagDAO類用來(lái)對(duì)便簽信息進(jìn)行管理;InaccountDAO類用來(lái)對(duì)收入信息進(jìn)行管理;OutaccountDAO類用來(lái)對(duì)支出信息進(jìn)行管理;PwdDAO類用來(lái)對(duì)密碼信息進(jìn)行管理。下面主要對(duì)DBOpenHelper類和InaccountDAO類進(jìn)行詳細(xì)講解。說明:FlagDAO類、OutaccountDAO類和PwdDAO類的實(shí)現(xiàn)過程與InaccountDAO類類似,這里不進(jìn)行詳細(xì)介紹,請(qǐng)參見本書附帶光盤中的源代碼。1.DBOpenHelper.java類DBOpenHelper類主要用來(lái)實(shí)現(xiàn)創(chuàng)建數(shù)據(jù)庫(kù)和數(shù)據(jù)表的功能,該類繼承自SQLiteOpenHelper類。在該類中,首先需要在構(gòu)造函數(shù)中創(chuàng)建數(shù)據(jù)庫(kù),然后在覆寫的onCreate()方法中使用SQLiteDatabase對(duì)象的execSQL()方法分別創(chuàng)建tb_outaccount、tb_inaccount、tb_pwd和tb_flag數(shù)據(jù)表。DBOpenHelper類的實(shí)現(xiàn)代碼如下:packagecom.xiaoke.accountsoft.dao;

importandroid.content.Context;

importandroid.database.sqlite.SQLiteDatabase;

importandroid.database.sqlite.SQLiteOpenHelper;

publicclassDBOpenHelperextendsSQLiteOpenHelper

{

privatestaticfinalintVERSION=1;//定義數(shù)據(jù)庫(kù)版本號(hào)

privatestaticfinalStringDBNAME="account.db";//定義數(shù)據(jù)庫(kù)名

publicDBOpenHelper(Contextcontext)//定義構(gòu)造函數(shù)

{

super(context,DBNAME,null,VERSION);//重寫基類的構(gòu)造函數(shù)

}

@Override

publicvoidonCreate(SQLiteDatabasedb)//創(chuàng)建數(shù)據(jù)庫(kù)

{

db.execSQL("createtabletb_outaccount(_idintegerprimarykey,moneydecimal,timevarchar(10),"+

"typevarchar(10),addressvarchar(100),markvarchar(200))");//創(chuàng)建支出信息表

db.execSQL("createtabletb_inaccount(_idintegerprimarykey,moneydecimal,timevarchar(10),"+

"typevarchar(10),handlervarchar(100),markvarchar(200))");//創(chuàng)建收入信息表

db.execSQL("createtabletb_pwd(passwordvarchar(20))");//創(chuàng)建密碼表

db.execSQL("createtabletb_flag(_idintegerprimarykey,flagvarchar(200))");//創(chuàng)建便簽信息表

}

//覆寫基類的onUpgrade方法,以便數(shù)據(jù)庫(kù)版本更新

@Override

publicvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion)

{

}

}2.InaccountDAO.java類InaccountDAO類主要用來(lái)對(duì)收入信息進(jìn)行管理,包括收入信息的添加、修改、刪除、查詢及獲取最大編號(hào)、總記錄數(shù)等功能,下面對(duì)該類中的構(gòu)造函數(shù)和方法進(jìn)行詳細(xì)講解。(1)InaccountDAO類的構(gòu)造函數(shù)在InaccountDAO類中定義DBOpenHelper和SQLiteDatabase對(duì)象,然后創(chuàng)建該類的構(gòu)造函數(shù),在構(gòu)造函數(shù)中初始化DBOpenHelper對(duì)象。主要代碼如下:privateDBOpenHelperhelper;//創(chuàng)建DBOpenHelper對(duì)象

privateSQLiteDatabasedb;//創(chuàng)建SQLiteDatabase對(duì)象

publicInaccountDAO(Contextcontext)//定義構(gòu)造函數(shù)

{

helper=newDBOpenHelper(context);//初始化DBOpenHelper對(duì)象

}(2)add(Tb_inaccounttb_inaccount)方法該方法的主要功能是添加收入信息,其中,參數(shù)tb_inaccount表示收入數(shù)據(jù)表對(duì)象。主要代碼如下:/**

*添加收入信息

*

*@paramtb_inaccount

*/

publicvoidadd(Tb_inaccounttb_inaccount)

{

db=helper.getWritableDatabase();//初始化SQLiteDatabase對(duì)象

//執(zhí)行添加收入信息操作

db.execSQL("insertintotb_inaccount(_id,money,time,type,handler,mark)values(?,?,?,?,?,?)",newObject[]

{tb_inaccount.getid(),tb_inaccount.getMoney(),tb_inaccount.getTime(),tb_inaccount.getType(),tb_inaccount.getHandler(),tb_inaccount.getMark()});

}(3)update(Tb_inaccounttb_inaccount)方法該方法的主要功能是根據(jù)指定的編號(hào)修改收入信息,其中,參數(shù)tb_inaccount表示收入數(shù)據(jù)表對(duì)象。主要代碼如下:/**

*更新收入信息

*

*@paramtb_inaccount

*/

publicvoidupdate(Tb_inaccounttb_inaccount)

{

db=helper.getWritableDatabase();//初始化SQLiteDatabase對(duì)象

//執(zhí)行修改收入信息操作

db.execSQL("updatetb_inaccountsetmoney=?,time=?,type=?,handler=?,mark=?where_id=?",newObject[]

{tb_inaccount.getMoney(),tb_inaccount.getTime(),tb_inaccount.getType(),tb_inaccount.getHandler(),tb_inaccount.getMark(),tb_inaccount.getid()});

}(4)find(intid)方法該方法的主要功能是根據(jù)指定的編號(hào)查找收入信息,其中,參數(shù)id表示要查找的收入編號(hào),返回值為Tb_inaccount對(duì)象。主要代碼如下:/**

*查找收入信息

*

*@paramid

*@return

*/

publicTb_inaccountfind(intid)

{

db=helper.getWritableDatabase();//初始化SQLiteDatabase對(duì)象

Cursorcursor=db.rawQuery("select_id,money,time,type,handler,markfromtb_inaccountwhere_id=?",newString[]

{String.valueOf(id)});//根據(jù)編號(hào)查找收入信息,并存儲(chǔ)到Cursor類中

if(cursor.moveToNext())//遍歷查找到的收入信息

{

//將遍歷到的收入信息存儲(chǔ)到Tb_inaccount類中

returnnewTb_inaccount(cursor.getInt(cursor.getColumnIndex("_id")),cursor.getDouble(cursor.getColumnIndex("money")),cursor.getString(cursor.getColumnIndex("time")),cursor.getString(cursor.getColumnIndex("type")),cursor.getString(cursor.getColumnIndex("handler")),cursor.getString(cursor.getColumnIndex("mark")));

}

returnnull;//如果沒有信息,則返回null

}(5)detele(Integer...ids)方法該方法的主要功能是根據(jù)指定的一系列編號(hào)刪除收入信息,其中,參數(shù)ids表示要?jiǎng)h除的收入編號(hào)的集合。主要代碼如下:/**

*刪除收入信息

*

*@paramids

*/

publicvoiddetele(Integer...ids)

{

if(ids.length>0)//判斷是否存在要?jiǎng)h除的id

{

StringBuffersb=newStringBuffer();//創(chuàng)建StringBuffer對(duì)象

for(inti=0;i<ids.length;i++)//遍歷要?jiǎng)h除的id集合

{

sb.append('?').append(',');//將刪除條件添加到StringBuffer對(duì)象中

}

sb.deleteCharAt(sb.length()-1);//去掉最后一個(gè)“,“字符

db=helper.getWritableDatabase();//初始化SQLiteDatabase對(duì)象

//執(zhí)行刪除收入信息操作

db.execSQL("deletefromtb_inaccountwhere_idin("+sb+")",(Object[])ids);

}

}(6)getScrollData(intstart,intcount)方法該方法的主要功能是從收入數(shù)據(jù)表的指定索引處獲取指定數(shù)量的收入數(shù)據(jù),其中,參數(shù)start表示要從此處開始獲取數(shù)據(jù)的索引;參數(shù)count表示要獲取的數(shù)量;返回值為L(zhǎng)ist<Tb_inaccount>對(duì)象。主要代碼如下:/**

*獲取收入信息

*@paramstart起始位置

*@paramcount每頁(yè)顯示數(shù)量

*@return

*/

publicList<Tb_inaccount>getScrollData(intstart,intcount)

{

List<Tb_inaccount>tb_inaccount=newArrayList<Tb_inaccount>();//創(chuàng)建集合對(duì)象

db=helper.getWritableDatabase();//初始化SQLiteDatabase對(duì)象

Cursorcursor=db.rawQuery("select*fromtb_inaccountlimit?,?",newString[]{String.valueOf(start),String.valueOf(count)});//獲取所有收入信息

while(cursor.moveToNext())//遍歷所有的收入信息

{

tb_inaccount.add(newTb_inaccount(cursor.getInt(cursor.getColumnIndex("_id")),cursor.getDouble(cursor.getColumnIndex("money")),cursor.getString(cursor.getColumnIndex("time")),cursor.getString(cursor.getColumnIndex("type")),cursor.getString(cursor.getColumnIndex("handler")),cursor.getString(cursor.getColumnIndex("mark"))));//將遍歷到的收入信息添加到集合中

}

returntb_inaccount;//返回集合

}(7)getCount()方法該方法的主要功能是獲取收入數(shù)據(jù)表中的總記錄數(shù),返回值為獲取到的總記錄數(shù)。主要代碼如下:/**

*獲取總記錄數(shù)

*@return

*/

publiclonggetCount()

{

db=helper.getWritableDatabase();//初始化SQLiteDatabase對(duì)象

Cursorcursor=db.rawQuery("selectcount(_id)fromtb_inaccount",null);//獲取收入信息的記錄數(shù)

if(cursor.moveToNext())//判斷Cursor中是否有數(shù)據(jù)

{

returncursor.getLong(0);//返回總記錄數(shù)

}

return0;//如果沒有數(shù)據(jù),則返回0

}(8)getMaxId()方法該方法的主要功能是獲取收入數(shù)據(jù)表中的最大編號(hào),返回值為獲取到的最大編號(hào)。主要代碼如下:/**

*獲取收入最大編號(hào)

*@return

*/

publicintgetMaxId()

{

db=helper.getWritableDatabase();//初始化SQLiteDatabase對(duì)象

Cursorcursor=db.rawQuery("selectmax(_id)fromtb_inaccount",null);//獲取收入信息表中的最大編號(hào)

while(cursor.moveToLast()){//訪問Cursor中的最后一條數(shù)據(jù)

returncursor.getInt(0);//獲取訪問到的數(shù)據(jù),即最大編號(hào)

}

return0;//如果沒有數(shù)據(jù),則返回0

}15.8登錄模塊設(shè)計(jì)教學(xué)錄像:光盤\TM\lx\15\登錄模塊設(shè)計(jì).exe本模塊使用的數(shù)據(jù)表:tb_pwd登錄模塊主要用于通過輸入正確的密碼進(jìn)入家庭理財(cái)通的主窗體,它可以提高程序的安全性,保護(hù)數(shù)據(jù)資料不外泄。登錄模塊運(yùn)行結(jié)果如圖15.10所示。圖15.10系統(tǒng)登錄15.8.1設(shè)計(jì)登錄布局文件在res\layout目錄下新建文件login.xml,用來(lái)作為登錄窗體的布局文件,在該布局文件中,將布局方式修改為RelativeLayout,然后添加一個(gè)TextView組件、一個(gè)EditText組件和兩個(gè)Button組件,實(shí)現(xiàn)代碼如下:<?xmlversion="1.0"encoding="utf-8"?>

<RelativeLayoutxmlns:android="/apk/res/android"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:padding="5dp"

>

<TextViewandroid:id="@+id/tvLogin"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_gravity="center"

android:gravity="center_horizontal"

android:text="請(qǐng)輸入密碼:"

android:textSize="25dp"

android:textColor="#8C6931"

/>

<EditTextandroid:id="@+id/txtLogin"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_below="@id/tvLogin"

android:inputType="textPassword"

android:hint="請(qǐng)輸入密碼"

/>

<Buttonandroid:id="@+id/btnClose"

android:layout_width="90dp"

android:layout_height="wrap_content"

android:layout_below="@id/txtLogin"

android:layout_alignParentRight="true"

android:layout_marginLeft="10dp"

android:text="取消"

/>

<Buttonandroid:id="@+id/btnLogin"

android:layout_width="90dp"

android:layout_height="wrap_content"

android:layout_below="@id/txtLogin"

android:layout_toLeftOf="@id/btnClose"

android:text="登錄"

/>

</RelativeLayout>15.8.2登錄功能的實(shí)現(xiàn)在com.xiaoke.accountsoft.activity包中創(chuàng)建一個(gè)Login.java文件,該文件的布局文件設(shè)置為login.xml。當(dāng)用戶在“請(qǐng)輸入密碼”文本框中輸入密碼后,單擊“登錄”按鈕,為“登錄”按鈕設(shè)置監(jiān)聽事件。在監(jiān)聽事件中,判斷數(shù)據(jù)庫(kù)中是否設(shè)置了密碼、輸入的密碼是否為空、輸入的密碼是否與數(shù)據(jù)庫(kù)中的密碼一致,如果條件滿足,則登錄主Activity;否則,彈出信息提示框。代碼如下:txtlogin=(EditText)findViewById(R.id.txtLogin);//獲取密碼文本框

btnlogin=(Button)findViewById(R.id.btnLogin);//獲取“登錄”按鈕

btnlogin.setOnClickListener(newOnClickListener(){//為“登錄”按鈕設(shè)置監(jiān)聽事件

@Override

publicvoidonClick(Viewarg0){

//TODOAuto-generatedmethodstub

Intentintent=newIntent(Login.this,MainActivity.class);//創(chuàng)建Intent對(duì)象

PwdDAOpwdDAO=newPwdDAO(Login.this);//創(chuàng)建PwdDAO對(duì)象

if((pwdDAO.getCount()==0|pwdDAO.find().getPassword().isEmpty())&&txtlogin.getText().toString().isEmpty()){//判斷是否有密碼及是否輸入了密碼

startActivity(intent);//啟動(dòng)主Activity

}

else{

//判斷輸入的密碼是否與數(shù)據(jù)庫(kù)中的密碼一致

if(pwdDAO.find().getPassword().equals(txtlogin.getText().toString())){

startActivity(intent);//啟動(dòng)主Activity

}

else{

//彈出信息提示

Toast.makeText(Login.this,"請(qǐng)輸入正確的密碼!",Toast.LENGTH_SHORT).show();

}

}

txtlogin.setText("");//清空密碼文本框

}

});說明:本系統(tǒng)中,在com.xiaoke.accountsoft.activity包中創(chuàng)建的.java類文件都是基于Activity類的,下面再遇到時(shí)將不再說明。15.8.3退出登錄窗口單擊“取消”按鈕,為“取消”按鈕設(shè)置監(jiān)聽事件。在監(jiān)聽事件中,調(diào)用finish()方法實(shí)現(xiàn)退出當(dāng)前程序的功能。代碼如下:btnclose=(Button)findViewById(R.id.btnClose);//獲取“取消”按鈕

btnclose.setOnClickListener(newOnClickListener(){//為“取消”按鈕設(shè)置監(jiān)聽事件

@Override

publicvoidonClick(Viewarg0){

//TODOAuto-generatedmethodstub

finish();//退出當(dāng)前程序

}

});15.9系統(tǒng)主窗體設(shè)計(jì)教學(xué)錄像:光盤\TM\lx\15\系統(tǒng)主窗體設(shè)計(jì).exe主窗體是程序操作過程中必不可少的,是與用戶交互的重要環(huán)節(jié)。通過主窗體,用戶可以調(diào)用系統(tǒng)相關(guān)的各子模塊,快速掌握本系統(tǒng)中所實(shí)現(xiàn)的各個(gè)功能。家庭理財(cái)通系統(tǒng)中,當(dāng)?shù)卿洿绑w驗(yàn)證成功后,將進(jìn)入主窗體,主窗體中以圖標(biāo)和文本相結(jié)合的方式顯示各功能按鈕,單擊這些功能按鈕可打開相應(yīng)功能的Activity。主窗體運(yùn)行結(jié)果如圖15.11所示。圖15.11家庭理財(cái)通主窗體15.9.1設(shè)計(jì)系統(tǒng)主窗體布局文件在res\layout目錄下新建文件main.xml,用來(lái)作為主窗體的布局文件,在該布局文件中,添加一個(gè)GridView組件,用來(lái)顯示功能圖標(biāo)及文本,實(shí)現(xiàn)代碼如下:<?xmlversion="1.0"encoding="utf-8"?>

<GridViewxmlns:android="/apk/res/android"

android:id="@+id/gvInfo"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:columnWidth="90dp"

android:numColumns="auto_fit"

verticalSpacing="10dp"

android:horizontalSpacing="10dp"

android:stretchMode="spacingWidthUniform"

android:gravity="center"

/>在res\layout目錄下再新建一個(gè)文件gvitem.xml,用來(lái)為main.xml布局文件中的GridView組件提供資源,然后在該文件中添加一個(gè)ImageView組件和一個(gè)TextView組件,實(shí)現(xiàn)代碼如下:<?xmlversion="1.0"encoding="utf-8"?>

<LinearLayoutxmlns:android="/apk/res/android"

android:id="@+id/item"

android:orientation="vertical"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_marginTop="5dp"

>

<ImageViewandroid:id="@+id/ItemImage"

android:layout_width="75dp"

android:layout_height="75dp"

android:layout_gravity="center"

android:scaleType="fitXY"

android:padding="4dp"

/>

<TextViewandroid:id="@+id/ItemTitle"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_gravity="center"

android:gravity="center_horizontal"

/>

</LinearLayout>15.9.2顯示各功能窗口在com.xiaoke.accountsoft.activity包中創(chuàng)建一個(gè)MainActivity.java文件,該文件的布局文件設(shè)置為main.xml。在MainActivity.java文件中,首先創(chuàng)建一個(gè)GridView組件對(duì)象,然后分別定義一個(gè)String類型的數(shù)組和一個(gè)int類型的數(shù)組,分別用來(lái)存儲(chǔ)系統(tǒng)功能的文本及對(duì)應(yīng)的圖標(biāo),代碼如下:GridViewgvInfo;//創(chuàng)建GridView對(duì)象

String[]titles=newString[]{"新增支出","新增收入","我的支出","我的收入","數(shù)據(jù)管理","系統(tǒng)設(shè)置","收支便簽","退出"};//定義字符串?dāng)?shù)組,存儲(chǔ)系統(tǒng)功能的文本

int[]images=newint[]{R.drawable.addoutaccount,R.drawable.addinaccount,

R.drawable.outaccountinfo,R.drawable.inaccountinfo,R.drawable.showinfo,R.drawable.sysset,R.drawable.accountflag,R.drawable.exit};//定義int數(shù)組,存儲(chǔ)功能對(duì)應(yīng)的圖標(biāo)當(dāng)用戶在主窗體中單擊各功能按鈕時(shí),使用相應(yīng)功能所對(duì)應(yīng)的Activity初始化Intent對(duì)象,然后使用startActivity()方法啟動(dòng)相應(yīng)的Activity,而如果用戶單擊的是“退出”按鈕,則調(diào)用finish()方法關(guān)閉當(dāng)前Activity。代碼如下:@Override

publicvoidonCreate(BundlesavedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

gvInfo=(GridView)findViewById(R.id.gvInfo);//獲取布局文件中的gvInfo組件

pictureAdapteradapter=newpictureAdapter(titles,images,this);//創(chuàng)建pictureAdapter對(duì)象

gvInfo.setAdapter(adapter);//為GridView設(shè)置數(shù)據(jù)源

gvInfo.setOnItemClickListener(newOnItemClickListener(){//為GridView設(shè)置項(xiàng)單擊事件

@Override

publicvoidonItemClick(AdapterView<?>arg0,Viewarg1,intarg2,

longarg3){

Intentintent=null;//創(chuàng)建Intent對(duì)象

switch(arg2){

case0:

//使用AddOutaccount窗口初始化Intent

intent=newIntent(MainActivity.this,AddOutaccount.class);

startActivity(intent);//打開AddOutaccount

break;

case1:

<p>//使用AddInaccount窗口初始化Intent</p>

intent=newIntent(MainActivity.this,AddInaccount.class);

startActivity(intent);//打開AddInaccount

break;

case2:

<p>//使用Outaccountinfo窗口初始化Intent</p>

intent=newIntent(MainActivity.this,Outaccountinfo.class);

startActivity(intent);//打開Outaccountinfo

break;

case3:

<p>//使用Inaccountinfo窗口初始化Intent</p>

intent=newIntent(MainActivity.this,Inaccountinfo.class);

startActivity(intent);//打開Inaccountinfo

break;

case4:

<p>//使用Showinfo窗口初始化Intent</p>

intent=newIntent(MainActivity.this,Showinfo.class);

startActivity(intent);//打開Showinfo

break;

case5:

intent=newIntent(MainActivity.this,Sysset.class);//使用Sysset窗口初始化Intent

startActivity(intent);//打開Sysset

break;

case6:

<p>//使用Accountflag窗口初始化Intent</p>

intent=newIntent(MainActivity.this,Accountflag.class);

startActivity(intent);//打開Accountflag

break;

case7:

finish();//關(guān)閉當(dāng)前Activity

}

}

});

}15.9.3定義文本及圖片組件定義一個(gè)ViewHolder類,用來(lái)定義文本組件及圖片組件對(duì)象,代碼如下:classViewHolder//創(chuàng)建ViewHolder類

{

publicTextViewtitle;//創(chuàng)建TextView對(duì)象

publicImageViewimage;//創(chuàng)建ImageView對(duì)象

}15.9.4定義功能圖標(biāo)及說明文字定義一個(gè)Picture類,用來(lái)定義功能圖標(biāo)及說明文字的實(shí)體,代碼如下:classPicture//創(chuàng)建Picture類

{

privateStringtitle;//定義字符串,表示圖像標(biāo)題

privateintimageId;//定義int變量,表示圖像的二進(jìn)制值

publicPicture()//默認(rèn)構(gòu)造函數(shù)

{

super();

}

publicPicture(Stringtitle,intimageId)//定義有參構(gòu)造函數(shù)

{

super();

this.title=title;//為圖像標(biāo)題賦值

this.imageId=imageId;//為圖像的二進(jìn)制值賦值

}

publicStringgetTitle(){//定義圖像標(biāo)題的可讀屬性

returntitle;

}

publicvoidsetTitle(Stringtitle){//定義圖像標(biāo)題的可寫屬性

this.title=title;

}

publicintgetImageId(){//定義圖像二進(jìn)制值的可讀屬性

returnimageId;

}

publicvoidsetimageId(intimageId){//定義圖像二進(jìn)制值的可寫屬性

this.imageId=imageId;

}

}15.9.5設(shè)置功能圖標(biāo)及說明文字定義一個(gè)pictureAdapter類,該類繼承自BaseAdapter類,用來(lái)為ViewHolder類中的TextView和ImageView組件設(shè)置功能圖標(biāo)及說明性文字,代碼如下:classpictureAdapterextendsBaseAdapter//創(chuàng)建基于BaseAdapter的子類

{

privateLayoutInflaterinflater;//創(chuàng)建LayoutInflater對(duì)象

privateList<Picture>pictures;//創(chuàng)建List泛型集合

//為類創(chuàng)建構(gòu)造函數(shù)

publicpictureAdapter(String[]titles,int[]images,Contextcontext){

super();

pictures=newArrayList<Picture>();//初始化泛型集合對(duì)象

inflater=LayoutInflater.from(context);//初始化LayoutInflater對(duì)象

for(inti=0;i<images.length;i++)//遍歷圖像數(shù)組

{

Picturepicture=newPicture(titles[i],images[i]);//使用標(biāo)題和圖像生成Picture對(duì)象

pictures.add(picture);//將Picture對(duì)象添加到泛型集合中

}

}

@Override

publicintgetCount(){//獲取泛型集合的長(zhǎng)度

//TODOAuto-generatedmethodstub

if(null!=pictures){//如果泛型集合不為空

returnpictures.size();//返回泛型長(zhǎng)度

}

else{

return0;//返回0

}

}

@Override

publicObjectgetItem(intarg0){

//TODOAuto-generatedmethodstub

returnpictures.get(arg0);//獲取泛型集合指定索引處的項(xiàng)

}

@Override

publiclonggetItemId(intarg0){

//TODOAuto-generatedmethodstub

returnarg0;//返回泛型集合的索引

}

@Override

publicViewgetView(intarg0,Viewarg1,ViewGrouparg2){

//TODOAuto-generatedmethodstub

ViewHolderviewHolder;//創(chuàng)建ViewHolder對(duì)象

if(arg1==null)//判斷圖像標(biāo)識(shí)是否為空

{

arg1=inflater.inflate(R.layout.gvitem,null);//設(shè)置圖像標(biāo)識(shí)

viewHolder=newViewHolder();//初始化ViewHolder對(duì)象

viewHolder.title=(TextView)arg1.findViewById(R.id.ItemTitle);//設(shè)置圖像標(biāo)題

viewHolder.image=(ImageView)arg1.findViewById(R.id.ItemImage);//設(shè)置圖像的二進(jìn)制值

arg1.setTag(viewHolder);//設(shè)置提示

}

else{

viewHolder=(ViewHolder)arg1.getTag();//設(shè)置提示

}

viewHolder.title.setText(pictures.get(arg0).getTitle());//設(shè)置圖像標(biāo)題

viewHolder.image.setImageResource(pictures.get(arg0).getImageId());//設(shè)置圖像的二進(jìn)制值

returnarg1;//返回圖像標(biāo)識(shí)

}

}15.10收入管理模塊設(shè)計(jì)教學(xué)錄像:光盤\TM\lx\15\收入管理模塊設(shè)計(jì).exe本模塊使用的數(shù)據(jù)表:tb_inaccount收入管理模塊主要包括3部分,分別是新增收入、收入信息瀏覽和修改/刪除收入信息模塊,其中,新增收入模塊用來(lái)添加收入信息;收入信息瀏覽模塊用來(lái)顯示所有的收入信息;修改/刪除收入信息模塊用來(lái)根據(jù)編號(hào)修改或者刪除收入信息,本節(jié)將從這3個(gè)方面對(duì)收入管理模塊進(jìn)行詳細(xì)介紹。首先來(lái)看新增收入模塊,“新增收入”窗體運(yùn)行結(jié)果如圖15.12所示。圖15.12新增收入15.10.1設(shè)計(jì)新增收入布局文件在res\layout目錄下新建文件addinaccount.xml,用來(lái)作為新增收入窗體的布局文件,該布局文件使用LinearLayout結(jié)合RelativeLayout進(jìn)行布局,在該布局文件中添加5個(gè)TextView組件、4個(gè)EditText組件、一個(gè)Spinner組件和兩個(gè)Button組件,實(shí)現(xiàn)代碼如下:<?xmlversion="1.0"encoding="utf-8"?>

<LinearLayoutxmlns:android="/apk/res/android"

android:id="@+id/initem"

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

>

<LinearLayout

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:layout_weight="3"

>

<TextView

android:layout_width="wrap_content"

android:layout_gravity="center"

android:gravity="center_horizontal"

android:text="新增收入"

android:textSize="40sp"

android:textColor="#ffffff"

android:textStyle="bold"

android:layout_height="wrap_content"/>

</LinearLayout>

<LinearLayout

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:layout_weight="1"

>

<RelativeLayoutandroid:layout_width="fill_parent"

android:layout_height="fill_parent"

android:padding="10dp"

>

<TextViewandroid:layout_width="90dp"

android:id="@+id/tvInMoney"

android:textSize="20sp"

android:text="金額:"

android:layout_height="wrap_content"

android:layout_alignBaseline="@+id/txtInMoney"

android:layout_alignBottom="@+id/txtInMoney"

android:layout_alignParentLeft="true"

android:layout_marginLeft="16dp">

</TextView>

<EditText

android:id="@+id/txtInMoney"

android:layout_width="210dp"

android:layout_height="wrap_content"

android:layout_toRightOf="@id/tvInMoney"

android:inputType="number"

android:numeric="integer"

android:maxLength="9"

android:hint="0.00"

/>

<TextViewandroid:layout_width="90dp"

android:id="@+id/tvInTime"

android:textSize="20sp"

android:text="時(shí)間:"

android:layout_height="wrap_content"

android:layout_alignBaseline="@+id/txtInTime"

android:layout_alignBottom="@+id/txtInTime"

android:layout_toLeftOf="@+id/txtInMoney">

</TextView>

<EditText

android:id="@+id/txtInTime"

android:layout_width="210dp"

android:layout_height="wrap_content"

android:layout_toRightOf="@id/tvInTime"

android:layout_below="@id/txtInMoney"

android:inputType="datetime"

android:hint="2011-01-01"

/>

<TextViewandroid:layout_width="90dp"

android:id="@+id/tvInType"

android:textSize="20sp"

android:text="類別:"

android:layout_height="wrap_content"

android:layout_alignBaseline="@+id/spInType"

android:layout_alignBottom="@+id/spInType"

android:layout_alignLeft="@+id/tvIn

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論