版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
目錄1.系統(tǒng)概述 32.系統(tǒng)功能分析 42.1主頁 42.2文件管理 52.3分類管理 63主要模塊實現(xiàn) 63.1快速進(jìn)入 63.2文件管理 73.3分類管理 114.系統(tǒng)測試 134.1按鈕和checkbox關(guān)系的測試 134.2expandablelistview調(diào)試 135.設(shè)計總結(jié) 13Android課程設(shè)計報告1.系統(tǒng)概述該應(yīng)用程序主要完成了手機(jī)文件管理的功能,包括新建,復(fù)制,移動和重命名文件,并且能夠進(jìn)行文件分類管理,實現(xiàn)某些文件關(guān)聯(lián)應(yīng)用,其中包括常見的圖片,音樂,視頻,文檔,安裝包以及壓縮包。另外,它能快速進(jìn)入內(nèi)置存儲卡或者外置存儲卡,不用單獨去找,方便使用。2.系統(tǒng)功能分析該應(yīng)用程序有一個Activity構(gòu)成,自定義titlebar,在viewpager里面放置三個Fragnment,分別管理三個頁面,這三個頁面如下:2.1主頁在主頁中,有九個按鈕:“后退”按鈕的功能是退出應(yīng)用程序;“圖片”,“音樂”,“視頻”,“文檔”,“安裝包”,“壓縮包”這六個按鍵的功能是跳轉(zhuǎn)到第三頁面,并且顯示相應(yīng)的內(nèi)容,例如,單擊“圖片”按鍵,應(yīng)用會跳轉(zhuǎn)到第三個頁面,同時打開手機(jī)中的圖片,包括內(nèi)置存儲卡和外置存儲卡中的全部圖片;最后兩個按鍵運(yùn)用圖文混排,單擊后會跳轉(zhuǎn)到第二頁面并且打開相對的文件,例如,單擊“extcard”,如果存在外置內(nèi)存卡就會在第二個頁面顯示外置存儲卡中的文件,否則將提示用戶外置存儲卡不存在,但不會跳轉(zhuǎn)。2.2文件管理在該頁面中也有9個按鈕,但是有部分按鈕剛開始時不可用的,當(dāng)點擊checkbox時來設(shè)置按鈕是否可用:“后退”按鍵的功能是返回到主頁中,“取消”按鍵的功能是取消checkbox的選擇。點擊列表的某一項可以打開該文件夾或者2.3分類管理該頁面中包含有一個按鈕和一個expandablelistview。單擊按鈕會跳轉(zhuǎn)到主頁中,點擊expandablelistview中某一條框會打開相對應(yīng)的文件,例如,點擊圖片的條框就能顯示打開手機(jī)中的圖片,包括內(nèi)置存儲卡和外置存儲卡中的全部圖片。3主要模塊實現(xiàn)3.1快速進(jìn)入快速進(jìn)入主要分為兩種:一種是點擊按鍵直接進(jìn)入相對應(yīng)的頁面及內(nèi)容,另一種是在文件第二個頁面的文本框中輸入想要進(jìn)入的文件夾或者想要打開的文件,并點擊旁邊的“前進(jìn)”按鈕,就會進(jìn)入輸入的文件夾或者打開輸入的文件。3.2文件管理文件管理的實現(xiàn)可以分為三步:讀取文件并顯示在靜態(tài)類Fragnmentmanager里面聲明一個靜態(tài)String類型的變量currentpath來記錄單圈文件夾的路徑,通過靜態(tài)類FileManager里面的靜態(tài)方法getlist來獲取當(dāng)前文件夾里面的全部文件,然后使用自定義的Adapter來顯示在自定義的listview里面。當(dāng)點擊某一item時重新調(diào)用該方法,以獲取新的文件列表,重新顯示在listview中。Getlist的代碼如下:publicstaticArrayList<HashMap<String,Object>>getlist(Stringpath){ArrayList<HashMap<String,Object>>list=newArrayList<HashMap<String,Object>>(); HashMap<String,Object>map=newHashMap<String,Object>(); Filefile1=newFile(path); if(file1.exists()){ FilefilePath=file1.getAbsoluteFile(); if(filePath.listFiles().length>0){ for(Filefile:filePath.listFiles()){ Strings=""; if(file.canRead())s+="r"; elses+="_"; if(file.canWrite())s+="w"; elses+="_"; if(file.canExecute())s+="x"; elses+="_"; s+=""+file.getUsableSpace()/1024/1024+"/" +file.getTotalSpace()/1024/1024; s+=""+file.getAbsolutePath(); map=newHashMap<String,Object>(); map.put("imageview",getpictures(file)); map.put("text1",file.getName()); map.put("text2",s); list.add(map);} returnlist; }else returnnull; }else returnnull;} Button之間關(guān)系的調(diào)控在listview的自定義的適配器MyAdapter中g(shù)etview的函數(shù)下,為checkbox寫一個監(jiān)聽事件,用以調(diào)控“新建”,“復(fù)制”等7個button的關(guān)系,并且將選擇的文件或者文件夾記錄下來。例如:選擇一個checkbox,“新建”按鍵不可用,“復(fù)制”,“移動”,“刪除”,“重命名”和“取消”這幾個按鈕設(shè)置為可點擊,再選擇另一個checkbox,“重命名”按鈕就設(shè)置為不可點擊……checkbox的監(jiān)聽事件代碼如下:privatevoidaddListener(listItemViewholder,finalintposition){holder.checkbox.setOnCheckedChangeListener(newOnCheckedChangeListener(){publicvoidonCheckedChanged(CompoundButtonarg0,booleanarg1){ HashMap<String,Object>map=newHashMap<String,Object>();if(arg1){Fragment2.newfile.setEnabled(false);Fragment2.copy.setEnabled(true);Fragment2.move.setEnabled(true);Fragment2.rename.setEnabled(true);Fragment2.paste.setEnabled(false);Fragment2.delete.setEnabled(true);Fragment2.cancel.setEnabled(true);HashMap<String,Object>map1=(HashMap<String,Object>)Fragment2.lv.getItemAtPosition(position);if(state.size()!=0){Filefirstfile=newFile(Fragmentmanage.checkfile.get(0).get("filepath").toString()); if(!((Fragmentmanage.currentpath.equals(firstfile.getParent()+"/")&&!Fragmentmanage.currentpath.equals("/"))||firstfile.getParent().equals(Fragmentmanage.currentpath)))){ Fragmentmanage.checkfile=newArrayList<HashMap<String,Object>>();}} map.put("position",position); map.put("filepath",Fragmentmanage.currentpath+map1.get("text1")+"/"); state.put(""+position,arg1); Fragmentmanage.checkfile.add(map); if(state.size()>1) Fragment2.rename.setEnabled(false);}else{ state.remove(""+position); if(state.size()==1) Fragment2.rename.setEnabled(true); if(state.size()==0){Fragment2.newfile.setEnabled(true);Fragment2.copy.setEnabled(false);Fragment2.move.setEnabled(false);Fragment2.rename.setEnabled(false);Fragment2.paste.setEnabled(false);Fragment2.delete.setEnabled(false);Fragment2.cancel.setEnabled(false);}for(inti=0;i<Fragmentmanage.checkfile.size();i++){if(Fragmentmanage.checkfile.get(i).get("position").equals(position)){Fragmentmanage.checkfile.remove(i);}}}}});}Button點擊事件的實現(xiàn)在Fragnmentmanager中聲明了靜態(tài)Boolean變量iscopy,ismove。“新建”:先判斷當(dāng)前文件夾是否可寫,如果可寫,則進(jìn)行下一步操作,否則提示不能創(chuàng)建。再判斷要新建的文件是否存在,如果存在,則進(jìn)行下一步,否則新建文件。最后,判斷是否覆蓋,如果是,則刪除原文件并新建文件。“復(fù)制”:將靜態(tài)變量iscopy設(shè)置為true,ismove設(shè)置為false?!耙苿印保簩㈧o態(tài)變量iscopy設(shè)置為false,ismove設(shè)置為true?!爸孛保合扰袛喈?dāng)前文件夾是否可寫,如果可寫,則進(jìn)行下一步,否則提示沒有寫權(quán)限,不能重命名。再判斷要重命名的文件是否存在,如果存在,則進(jìn)行下一步,否則重命名文件。最后,判斷是否覆蓋,如果是,則刪除原文件并重命名文件。流程圖與上圖相同。“粘貼”:先判斷iscopy是否為true,如果是,則調(diào)用FileManager里面的copyfiles函數(shù),在判斷ismove是否為true,如果是,則調(diào)用FileManager里面的copyfiles函數(shù)。最后將選擇的列表清零,iscopy和ismove設(shè)置為false。Copyfiles函數(shù):publicstaticvoidcopyfiles(finalArrayList<HashMap<String,Object>>list,Stringtofilepath,Contextcontext)if(newFile(tofilepath).canWrite()){ for(inti=0;i<list.size();i++){ Filefile=newFile(list.get(i).get("filepath").toString()); if(file.isDirectory()){//復(fù)制文件夾的函數(shù),即先判斷文件是否為空,如果是,則在tofilepath里面新建一個文件夾,如果否,則判斷是否為文件,如果是,則直接調(diào)用pastefile函數(shù)將文件復(fù)制過去,如果否,則遞歸調(diào)用copyfolder函數(shù)copyfolder(file,tofilepath+file.getName()+"/",context);}elsepastefile(file.getPath(),tofilepath+file.getName()+"/",context); }elseToast.makeText(context,"無法復(fù)制,當(dāng)前文件沒有寫權(quán)限!",Toast.LENGTH_SHORT).show(); }“取消”:將選擇的列表清零,iscopy和ismove設(shè)置為false,并調(diào)用removeselected函數(shù)將勾選的checkbox的鉤鉤去掉。State是MyAdapter中的記錄checkbox是否被選擇的變量。privatevoidremoveselect(){ Adapteradapter=lv.getAdapter(); HashMap<String,Boolean>state=((MyAdapter)adapter).getselected(); for(inti=0;i<state.size();i++){ state.put(Fragmentmanage.checkfile.get(i).get("position") .toString(),null); }}3.3分類管理先遍歷內(nèi)置存儲卡和外置存儲卡通過后綴名找出相對應(yīng)的文件,然后將其顯示在expandablelistview中,當(dāng)單擊某一文件時,通過相關(guān)的應(yīng)用打開該文件。具體函數(shù):publicstaticvoidopenFile(Filefile,Contextcontext){ if(file.canRead()){ Intentintent=newIntent(); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setAction(android.content.Intent.ACTION_VIEW); Stringtype=getMIMEType(file); intent.setDataAndType(Uri.fromFile(file),type); context.startActivity(intent); }elseToast.makeText(context,"沒有讀取權(quán)限!",Toast.LENGTH_LONG).show();} //通過后綴名獲取文件類型,并關(guān)聯(lián)相關(guān)程序publicstaticStringgetMIMEType(Filefile){ Stringtype=""; Stringname=file.getName(); if(name.endsWith(".m4a")||name.endsWith(".mp3") ||name.endsWith(".wav")){ type="audio/*"; }elseif(name.endsWith(".mp4")||name.endsWith(".3gp")){ type="video/*"; }elseif(name.endsWith(".jpg")||name.endsWith(".png") ||name.endsWith(".jpeg")||name.endsWith(".bmp") ||name.endsWith(".gif")){ type="image/*"; }elseif(name.endsWith(".apk")){ type="application/vnd.android.package-archive"; }elseif(name.endsWith(".zip")||name.endsWith(".tar")){ type="application/x-compressed"; }elseif(name.endsWith(".txt")||name.endsWith(".sh") ||name.endsWith(".c")||name.endsWith(".conf") ||name.endsWith(".cpp")||name.endsWith(".html")){ type="text/*";}else{type="application/*";//如果無法直接打開,跳出列表由用戶選擇}returntype;}4.系統(tǒng)測試4.1”新建”等按鈕和checkbox關(guān)系的測試因為listview是采用的是自定義的布局,所以checkbox的選擇無法正常進(jìn)行,出現(xiàn)滑動listview時,被選中的checkbox改變。最后通過網(wǎng)上搜索,找到解決辦法在自定義的adapter里面定義一個boolean類型的數(shù)組,用以記錄被選中checkbox的位置,從而解決該問題。 按鈕和checkbox之間有很強(qiáng)的關(guān)聯(lián)性,checkbox被選中時哪些能夠點擊,哪些不能點擊。點擊paste按鈕時,checkbox被選中狀態(tài)的取消等待。這些的邏輯性太強(qiáng),導(dǎo)致我自己在該問題上耗費(fèi)大量時間來調(diào)試,最終通過在Fragmentmanager這個靜態(tài)類里面定義靜態(tài)的boolean變量ismult和issingle來記錄checkbox總的狀態(tài),從而調(diào)節(jié)button的enable屬性。4.2expandablelistview調(diào)試 為了寫這個expandablelistview,我在網(wǎng)上找了很多教程,但是發(fā)現(xiàn),運(yùn)行別人的程序時可以成功,但是自己寫時就只能顯示一行,而且無法點擊顯示該標(biāo)題下的內(nèi)容,在當(dāng)天一下午不管怎樣修改代碼就是不正確,后來無意中復(fù)制別人寫的布局代碼到我的程序中時竟然成功了.至此,我才知道原來布局也可以決定程序運(yùn)行的成敗的.4.3新建,復(fù)制等功能的實現(xiàn)測試 新建,復(fù)制等功能在Fragnmentmanager的類中以函數(shù)的形式寫好了,但是當(dāng)調(diào)用該函數(shù)時發(fā)現(xiàn)有些可以成功,有些卻直接讓程序崩潰.通過不斷嘗試,找到崩潰的位置,終于找到了原因:原來文件權(quán)限的不同,使得對部分文件的讀寫無法進(jìn)行.因此在后來修改代碼時,將權(quán)限的判斷加入后就沒有出現(xiàn)類似問題了.當(dāng)然,一個人的思維是不完善的,程序中可能還會有這樣的問題沒有被發(fā)現(xiàn).5.設(shè)計總結(jié)經(jīng)過這次課程設(shè)計,我發(fā)現(xiàn)自己在寫
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《域名品牌保護(hù)介紹》課件
- 《吆喝課件》課件
- 電力電工基礎(chǔ)習(xí)題庫含答案
- 養(yǎng)老院老人生活設(shè)施管理制度
- 養(yǎng)老院老人財產(chǎn)保管制度
- 《皮內(nèi)針刺法》課件
- 旅客運(yùn)輸合同(2篇)
- 2024全新生物制品檢測與質(zhì)量保證合同2篇
- 電器課件-交流發(fā)電機(jī)
- 2025年廣東貨運(yùn)從業(yè)資格仿真考題
- 三傻大鬧寶萊塢課件
- 蓬萊19-3油田溢油事故案例分析工程倫理
- 【創(chuàng)業(yè)企業(yè)商業(yè)模式創(chuàng)新調(diào)研分析報告3000字(論文)】
- 550kta MTO (甲醇制烯烴)反應(yīng)工段的工藝設(shè)計
- 國家OTC藥品目錄(全部品種)
- 社會主義發(fā)展簡史智慧樹知到課后章節(jié)答案2023年下北方工業(yè)大學(xué)
- 2022年考研數(shù)學(xué)(二)真題(含答案及解析)【可編輯】
- 學(xué)生填涂答題卡注意事項詳解(中小學(xué)生考試專題講解培訓(xùn)課件)
- 三相橋式全控整流及有源逆變電路仿真
- 法學(xué)院學(xué)生職業(yè)生涯規(guī)劃書模板
- 課題研究技術(shù)路線圖
評論
0/150
提交評論