技术:Android+java
 

概述

XC文件管理器,是基于Android6.0+开发的一个方便易用的文件管理器,具有文件的目录管理和文件的管理,主要包括文件的新建、删除、重命名、复制,移动剪切以及文件详情查看等文件和目录的功能,同时支持文件和目录的批量管理,应该功能较全,视图提供两种:网格视图以及列表视图,应用界面简洁美观,易用性强,是较好易用的一款Android文件管理应用。

详细

一、概述

XC文件管理器,是基于Android6.0开发的一个方便易用的文件管理器,具有文件的目录管理和文件的管理,主要包括文件的新建、删除、重命名、复制,移动剪切以及文件详情查看等文件和目录的功能,同时支持文件和目录的批量管理,应该功能较全,视图提供两种:网格视图以及列表视图,应用界面简洁美观,易用性强,是较好易用的一款Android文件管理应用。

二、应用效果图

  

 

 

 

三、整体架构以及设计开发方案

1.整体页面框架采用Header+body+Footer三段式设计,核心首页页面以及Footer布局代码如下:

  1. <RelativeLayout xmlns:android="
  2. http://schemas.android.com/apk/res/android
  3. "
  4.  
  5. xmlns:tools="
  6. http://schemas.android.com/tools
  7. "
  8.  
  9. android:layout_width="fill_parent"
  10.  
  11. android:layout_height="fill_parent"
  12.  
  13. android:background="#F6F6F6"
  14.  
  15. >
  16.  
  17. <include layout="@layout/main_header"/>
  18.  
  19. <include layout="@layout/main_start"/>
  20.  
  21. <include layout="@layout/main_path"/>
  22.  
  23. <include layout="@layout/sdcard_listview"/>
  24.  
  25. <include layout="@layout/sdcard_gridview"/>
  26.  
  27. <include layout="@layout/morefile_menu_listview"/>
  28.  
  29. <include layout="@layout/file_search_view"/>
  30.  
  31. <include layout="@layout/main_footer"/>
  32.  
  33. </RelativeLayout>
  34.  
  35. <RelativeLayout xmlns:android="
  36. http://schemas.android.com/apk/res/android
  37. "
  38.  
  39. xmlns:tools="
  40. http://schemas.android.com/tools
  41. "
  42.  
  43. android:layout_width="fill_parent"
  44.  
  45. android:layout_height="60dp"
  46.  
  47. android:layout_alignParentBottom="true"
  48.  
  49. android:background="#F6F6F6"
  50.  
  51. android:id="@+id/main_relativelayout_footer"
  52.  
  53. >
  54.  
  55. <LinearLayout
  56.  
  57. android:id="@+id/llWelcomeSmile"
  58.  
  59. android:layout_width="fill_parent"
  60.  
  61. android:layout_height="60dp"
  62.  
  63. android:orientation="horizontal"
  64.  
  65. android:gravity="center"
  66.  
  67. >
  68.  
  69. <ImageView
  70.  
  71. android:id="@+id/ivWelcomeSmile"
  72.  
  73. android:layout_width="wrap_content"
  74.  
  75. android:layout_height="60dp"
  76.  
  77. android:src="@drawable/smile"
  78.  
  79. android:visibility="visible"
  80.  
  81. />
  82.  
  83. <TextView
  84.  
  85. android:id="@+id/tvWelcomeText"
  86.  
  87. android:layout_width="wrap_content"
  88.  
  89. android:layout_height="60dp"
  90.  
  91. android:gravity="center_vertical"
  92.  
  93. android:text=" 欢迎您使用XC文件管理器"
  94.  
  95. android:textColor="#222222"
  96.  
  97. android:visibility="visible"
  98.  
  99. />
  100.  
  101. </LinearLayout>
  102.  
  103. <GridView
  104.  
  105. android:id="@+id/gvFooterView"
  106.  
  107. android:layout_width="fill_parent"
  108.  
  109. android:layout_height="60dp"
  110.  
  111. android:layout_alignParentBottom="true"
  112.  
  113. android:visibility="gone"
  114.  
  115. android:listSelector="@drawable/meu_item_gb_blue2"
  116.  
  117. android:background="#04AEDA"
  118.  
  119. >
  120.  
  121. </GridView>
  122.  
  123. <GridView
  124.  
  125. android:id="@+id/gvFileMenuGrid"
  126.  
  127. android:layout_width="fill_parent"
  128.  
  129. android:layout_height="60dp"
  130.  
  131. android:layout_alignParentBottom="true"
  132.  
  133. android:visibility="gone"
  134.  
  135. android:listSelector="@drawable/meu_item_gb_blue2"
  136.  
  137. android:background="#04AEDA"
  138.  
  139. >
  140.  
  141. </GridView>
  142.  
  143. <GridView
  144.  
  145. android:id="@+id/gvCopyAndMoveMenuGrid"
  146.  
  147. android:layout_width="fill_parent"
  148.  
  149. android:layout_height="60dp"
  150.  
  151. android:layout_alignParentBottom="true"
  152.  
  153. android:visibility="gone"
  154.  
  155. android:listSelector="@drawable/meu_item_gb_blue2"
  156.  
  157. android:background="#04AEDA"
  158.  
  159. >
  160.  
  161. </GridView>
  162.  
  163. </RelativeLayout>

2.获取手机文件目录核心实现

  1. /**
  2.  
  3. * 设置MainList的数据
  4.  
  5. */
  6.  
  7. public void setMainlistData(){
  8.  
  9. PhoneDir dir = new PhoneDir();
  10.  
  11. dir.setImageID(R.drawable.sdcard);
  12.  
  13. dir.setStrDirName("存储卡/SD卡目录");
  14.  
  15. String dAllSpace = CommonUtils.getSdCardAllSpace();
  16.  
  17. String dFreeSpace = CommonUtils.getSdCardFreeSpace();
  18.  
  19. String strOther = ""+dFreeSpace +"GB可用/"+dAllSpace+"GB总计";
  20.  
  21. dir.setStrDirOther(strOther);
  22.  
  23. mainlist.add(dir);
  24.  
  25. dir = new PhoneDir();
  26.  
  27. dir.setImageID(R.drawable.systemdir);
  28.  
  29. dir.setStrDirName("系统目录/手机目录");
  30.  
  31. dir.setStrDirOther("请谨慎操作系统目录文件");
  32.  
  33. mainlist.add(dir);
  34.  
  35. }
  36.  
  37. /**
  38.  
  39. * 设置要显示的文件列表数据的数据
  40.  
  41. */
  42.  
  43. public void setFileListData(String strPath){
  44.  
  45. String strShowPath;
  46.  
  47. if(strCurPath.contains(CommonUtils.getSdCardRoot())){
  48.  
  49. strShowPath = strCurPath.replaceAll(CommonUtils.getSdCardRoot(), "我的手机》存储卡");
  50.  
  51. }else{
  52.  
  53. strShowPath = strCurPath.replaceAll(FileUtils.getPhoneRoot(), "我的手机》系统目录");
  54.  
  55. }
  56.  
  57. strShowPath =strShowPath.replaceAll("/", "》");
  58.  
  59. tvShowPath.setText(strShowPath);
  60.  
  61. ArrayList fileList = FileUtils.getFilesOfCurDir(strPath);
  62.  
  63. FileItem item ;
  64.  
  65. File file ;
  66.  
  67. sdcardlist.clear();
  68.  
  69. sdcardGrid.clear();
  70.  
  71. for(int i = 0;i<fileList.size();i++){
  72.  
  73. item = new FileItem();
  74.  
  75. file = (File) fileList.get(i);
  76.  
  77. if(file.isDirectory()){//目录情况
  78.  
  79. item.setImageID(R.drawable.folder);
  80.  
  81. item.setbIsDir(true);
  82.  
  83. item.setnFileSize(0);
  84.  
  85. }else{//文件情况
  86.  
  87. item.setImageID(R.drawable.file);
  88.  
  89. item.setbIsDir(false);
  90.  
  91. item.setnFileSize(file.length());
  92.  
  93. }
  94.  
  95. item.setStrFilePath(file.getAbsolutePath());
  96.  
  97. item.setStrFileName(file.getName());
  98.  
  99. item.setStrDateTime(FileUtils.getFileLastModifiedTime(file));
  100.  
  101. sdcardlist.add(item);
  102.  
  103. sdcardGrid.add(item);
  104.  
  105. }
  106.  
  107. }

3.实现列表和缩略图方格UI布局样式切换

该功能主要是基于ListView和GridView进行UI 和数据适配器的更新切换,核心代码如下

  1. if(mViewTypeStatus == Constant.VIEW_LISTVIEW)
  2.  
  3. {//ListView切换到GridView
  4.  
  5. llSdcardList.setVisibility(View.GONE);
  6.  
  7. llSdcardGrid.setVisibility(View.VISIBLE);
  8.  
  9. sdcardListView.setVisibility(View.GONE);
  10.  
  11. sdcardGridView.setVisibility(View.VISIBLE);
  12.  
  13. ImageView iv = (ImageView)view.findViewById(R.id.ivItemImage);
  14.  
  15. iv.setImageResource(R.drawable.footer_menu_list);
  16.  
  17. mViewTypeStatus = Constant.VIEW_GRIDVIEW;
  18.  
  19. setFileListData(strCurPath);
  20.  
  21. refreshData();
  22.  
  23. }
  24.  
  25. else{//GridView切换到ListView
  26.  
  27. llSdcardList.setVisibility(View.VISIBLE);
  28.  
  29. llSdcardGrid.setVisibility(View.GONE);
  30.  
  31. sdcardGridView.setVisibility(View.GONE);
  32.  
  33. sdcardListView.setVisibility(View.VISIBLE);
  34.  
  35. ImageView iv = (ImageView)view.findViewById(R.id.ivItemImage);
  36.  
  37. iv.setImageResource(R.drawable.footer_menu_grid);
  38.  
  39. mViewTypeStatus = Constant.VIEW_LISTVIEW;
  40.  
  41. setFileListData(strCurPath);
  42.  
  43. refreshData();
  44.  
  45. }
  46.  
  47. break;
  48.  
  49. /**
  50.  
  51. * 刷新当前页面(ListView或者GridView)数据
  52.  
  53. */
  54.  
  55. public void refreshData(){
  56.  
  57. if(mViewTypeStatus == Constant.VIEW_LISTVIEW){
  58.  
  59. sdcardListAdapter = new SdcardListAdapter(MainActivity.this, sdcardlist);
  60.  
  61. sdcardListView.setAdapter(sdcardListAdapter);
  62.  
  63. }else {
  64.  
  65. sdcardGridAdapter = new SdcardGridAdapter(MainActivity.this, sdcardGrid);
  66.  
  67. sdcardGridView.setAdapter(sdcardGridAdapter);
  68.  
  69. }
  70.  
  71. if(sdcardlist.size() <= 0 ){
  72.  
  73. ToastUtils.ToastAtCenterPosition(MainActivity.this, "目录为空,没有任何文件!");
  74.  
  75. }
  76.  
  77. }

4.添加文件搜索功能

搜索功能是搜索文件目录下的所有符合搜索关键字的文件或者目录,相关初始化和核心实现代码如下:

  1. /**
  2.  
  3. * 初始化 搜索框视图 即rlSearchView视图
  4.  
  5. */
  6.  
  7. public void initSearchView(){
  8.  
  9. //初始化搜索框视图
  10.  
  11. rlSearchView = (RelativeLayout)findViewById(R.id.rlSearchView);
  12.  
  13. rlSearchView.setVisibility(View.GONE);
  14.  
  15. final EditText editText = (EditText)rlSearchView.findViewById(R.id.etSearchTextView);
  16.  
  17. editText.addTextChangedListener(new TextWatcher() {
  18.  
  19. @Override
  20.  
  21. public void onTextChanged(CharSequence s, int start, int before, int count) {
  22.  
  23. // TODO Auto-generated method stub
  24.  
  25. String condition = editText.getText().toString();
  26.  
  27. if (condition.equals("")) {
  28.  
  29. setFileListData(strCurPath);
  30.  
  31. refreshData();
  32.  
  33. }else{
  34.  
  35. searchFilesList.clear();
  36.  
  37. searchSdCardFiles(new File(strCurPath));
  38.  
  39. setSearchListData(condition);
  40.  
  41. refreshData();
  42.  
  43. }
  44.  
  45. }
  46.  
  47. @Override
  48.  
  49. public void beforeTextChanged(CharSequence s, int start, int count,
  50.  
  51. int after) {
  52.  
  53. // TODO Auto-generated method stub
  54.  
  55. }
  56.  
  57. @Override
  58.  
  59. public void afterTextChanged(Editable s) {
  60.  
  61. // TODO Auto-generated method stub
  62.  
  63. }
  64.  
  65. });
  66.  
  67. ImageView ivCancelSearch = (ImageView)rlSearchView.findViewById(R.id.ivCancelSearch);
  68.  
  69. ivCancelSearch.setOnClickListener(new OnClickListener() {
  70.  
  71. @Override
  72.  
  73. public void onClick(View v) {
  74.  
  75. // TODO Auto-generated method stub
  76.  
  77. rlSearchView.setVisibility(View.GONE);
  78.  
  79. }
  80.  
  81. });
  82.  
  83. }
  84.  
  85. /**
  86.  
  87. * 遍历SD卡
  88.  
  89. */
  90.  
  91. public void searchSdCardFiles(File root){
  92.  
  93. File files[] = root.listFiles();
  94.  
  95. if(files != null)
  96.  
  97. for(File f:files){
  98.  
  99. if(f.isDirectory()){
  100.  
  101. searchFilesList.add(f);
  102.  
  103. searchSdCardFiles(f);
  104.  
  105. }
  106.  
  107. else{
  108.  
  109. searchFilesList.add(f);
  110.  
  111. }
  112.  
  113. }
  114.  
  115. }
  116.  
  117. /**
  118.  
  119. * 设置要显示的搜索出来的文件列表数据的数据
  120.  
  121. */
  122.  
  123. public void setSearchListData(String condition){
  124.  
  125. String strShowPath = "搜索结果:";
  126.  
  127. tvShowPath.setText(strShowPath);
  128.  
  129. FileItem item ;
  130.  
  131. File file ;
  132.  
  133. sdcardlist.clear();
  134.  
  135. for(int i = 0;i<searchFilesList.size();i++){
  136.  
  137. item = new FileItem();
  138.  
  139. file = (File) searchFilesList.get(i);
  140.  
  141. if(!file.getAbsolutePath().contains(condition))
  142.  
  143. continue;
  144.  
  145. if(file.isDirectory()){//目录情况
  146.  
  147. item.setImageID(R.drawable.folder);
  148.  
  149. item.setbIsDir(true);
  150.  
  151. item.setnFileSize(0);
  152.  
  153. }else{//文件情况
  154.  
  155. item.setImageID(R.drawable.file);
  156.  
  157. item.setbIsDir(false);
  158.  
  159. item.setnFileSize(file.length());
  160.  
  161. }
  162.  
  163. item.setStrFilePath(file.getAbsolutePath());
  164.  
  165. item.setStrFileName(file.getName());
  166.  
  167. item.setStrDateTime(FileUtils.getFileLastModifiedTime(file));
  168.  
  169. sdcardlist.add(item);
  170.  
  171. }
  172.  
  173. }

5.由于本项目代码量比较多,在此就不把其他所有功能都一一罗列了,其他的常规的复制,剪切,新建文件等功能,以及版权和检查更新弹窗功能实现,请大家下载源码具体,谢谢大家,希望对大家有所帮助。

四、项目代码目录结构

注:本文著作权归作者,由demo大师发表,拒绝转载,转载需要作者授权

XC文件管理器-打造优美易用的文件管理器的更多相关文章

  1. [转]教大家如何打造使用Tcpview(tcp查看器

    原文地址:教大家如何打造使用Tcpview(tcp查看器)作者:jybasenet3   一玩 VS 对战平台的同学有一次发现了一个可以踢人的方法,就是用 TcpView 把那个连 接关掉.后来VS ...

  2. 使用Vitamio打造自己的Android万能播放器(6)——在线播放(播放列表)

    前言 新版本的VPlayer由设计转入开发阶段,预计开发周期为一个月,这也意味着新版本的Vitamio将随之发布,开发者们可以和本系列文章一样,先开发其他功能.本章内容为"在线视频播放列表& ...

  3. 使用Vitamio打造自己的Android万能播放器(5)——在线播放(播放优酷视频)

    前言 为了保证每周一篇的进度,又由于Vitamio新版本没有发布, 决定推迟本地播放的一些功能(截图.视频时间.尺寸等),跳过直接写在线播放部分的章节.从Vitamio的介绍可以看得出,其支持http ...

  4. 使用Vitamio打造自己的Android万能播放器(4)——本地播放(快捷搜索、数据存储)

    前言 关键字:Vitamio.VPlayer.Android播放器.Android影音.Android开源播放器 本章节把Android万能播放器本地播放的主要功能(缓存播放列表和A-Z快速查询功能) ...

  5. 使用Vitamio打造自己的Android万能播放器(3)——本地播放(主界面、播放列表)

    前言 打造一款完整可用的Android播放器有许多功能和细节需要完成,也涉及到各种丰富的知识和内容,本章将结合Fragment.ViewPager来搭建播放器的主界面,并实现本地播放基本功能.系列文章 ...

  6. 使用Vitamio打造自己的Android万能播放器(2)—— 手势控制亮度、音量、缩放

    前言 本章继续完善播放相关播放器的核心功能,为后续扩展打好基础.   声明 欢迎转载,但请保留文章原始出处:)  博客园:http://www.cnblogs.com 农民伯伯: http://ove ...

  7. 使用Vitamio打造自己的Android万能播放器(7)——在线播放(下载视频)

    前言 本章将实现非常实用的功能——下载在线视频.涉及到多线程.线程更新UI等技术,还需思考产品的设计,如何将新加的功能更好的融入到现有的产品中,并不是简单的加一个界面就行了,欢迎大家交流产品设计和技术 ...

  8. 端云协同,打造更易用的AI计算平台

    内容来源:华为开发者大会2021 HMS Core 6 AI技术论坛,主题演讲<端云协同,HUAWEI HiAI Foundation打造更易用的AI计算平台>. 演讲嘉宾:华为海思AI技 ...

  9. 如何用vue打造一个移动端音乐播放器

    写在前面 没错,这就是慕课网上的那个vue音乐播放器,后台是某音乐播放器的线上接口扒取,虽然这类项目写的人很多,但不得不说这还是个少有的适合vue提升的好项目,做这个项目除了想写一个比较大并且功能复杂 ...

随机推荐

  1. postgresql共享内存的三个结构体

    本文原创为freas_1990,转载请标明出处:http://blog.csdn.net/freas_1990/article/details/16105797 postgresql的共享内存维护主要 ...

  2. iOS 加密的3种方法

    //需要导入   #import <CommonCrypto/CommonCryptor.h> ==============MD5加密============ NSString *str ...

  3. [leetcode]Substring with Concatenation of All Words @ Python

    原题地址:https://oj.leetcode.com/problems/substring-with-concatenation-of-all-words/ 题意: You are given a ...

  4. 【Spark】SparkStreaming-Kafka-Redis-集成-基础参考资料

    SparkStreaming-Kafka-Redis-集成-基础参考资料 Overview - Spark 2.2.0 Documentation Spark Streaming + Kafka In ...

  5. FastText 文本分类使用心得

    http://blog.csdn.net/thriving_fcl/article/details/53239856 最近在一个项目里使用了fasttext[1], 这是facebook今年开源的一个 ...

  6. centos配置ssh免密码登录

    master.slave1两台机器实现ssh免密码登录,user:hadoop,passwd:123456 1.设置master: vi /etc/sysconfig/network hostname ...

  7. HTML/CSS-返回到上一页

    <a class="back_btn" href="javascript:window.history.go(-1)">< 返回</a& ...

  8. protobuf-c的学习总结

    1.前言 项目中用到protobuf-c进行数据序列化,好处在于后期程序扩展性非常好,只需要改动proto的定义就可以保持兼容,非常的灵活方便.关于protobuf-c的详细介绍可以参考google官 ...

  9. 怎样将 MySQL 迁移到 MariaDB 上

    自从甲骨文收购 MySQL 后,由于甲骨文对 MySQL 的开发和维护更多倾向于闭门的立场,很多 MySQL 的开发者和用户放弃了它.在社区驱动下,促使更多人移到 MySQL 的另一个叫 MariaD ...

  10. OpenGL ES 3.0之Texturing纹理详解(一)

    本文流程 1.Texturing基础 2.装载Texturing和mipmapping 3.纹理过滤和包装 4.Texture level-of-detail, swizzles, and depth ...