版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年寧夏農(nóng)墾金融控股有限公司招聘筆試參考題庫(kù)含答案解析
- 2025年度住宅小區(qū)地下車庫(kù)車位產(chǎn)權(quán)轉(zhuǎn)讓及車位租賃合同3篇
- 2025版二手房買賣家居風(fēng)水咨詢合同3篇
- 2025年度個(gè)人汽車租賃押金退還服務(wù)協(xié)議2篇
- 2025年度文化藝術(shù)品展覽與拍賣合作協(xié)議3篇
- 2025年全球及中國(guó)達(dá)格列凈片行業(yè)頭部企業(yè)市場(chǎng)占有率及排名調(diào)研報(bào)告
- 2025-2030全球工業(yè)系統(tǒng)智能化解決方案行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 2025-2030全球吸附無(wú)細(xì)胞百白破聯(lián)合疫苗行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 2024年科普知識(shí)競(jìng)賽試題庫(kù)及答案(共80題)
- 所有股東股份轉(zhuǎn)讓協(xié)議
- GB/T 45120-2024道路車輛48 V供電電壓電氣要求及試驗(yàn)
- 2025年中核財(cái)務(wù)有限責(zé)任公司招聘筆試參考題庫(kù)含答案解析
- 春節(jié)文化常識(shí)單選題100道及答案
- 華中師大一附中2024-2025學(xué)年度上學(xué)期高三年級(jí)第二次考試數(shù)學(xué)試題(含解析)
- 12123交管學(xué)法減分考試題及答案
- 2025年寒假實(shí)踐特色作業(yè)設(shè)計(jì)模板
- 《數(shù)據(jù)采集技術(shù)》課件-XPath 解析庫(kù)
- 財(cái)務(wù)報(bào)銷流程培訓(xùn)課程
- 成人腦室外引流護(hù)理-中華護(hù)理學(xué)會(huì)團(tuán)體 標(biāo)準(zhǔn)
- 24年追覓在線測(cè)評(píng)28題及答案
- 春節(jié)慰問困難職工方案春節(jié)慰問困難職工活動(dòng)
評(píng)論
0/150
提交評(píng)論