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





三、整体架构以及设计开发方案
1.整体页面框架采用Header+body+Footer三段式设计,核心首页页面以及Footer布局代码如下:
<RelativeLayout xmlns:android="
http://schemas.android.com/apk/res/android
" xmlns:tools="
http://schemas.android.com/tools
" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#F6F6F6" > <include layout="@layout/main_header"/> <include layout="@layout/main_start"/> <include layout="@layout/main_path"/> <include layout="@layout/sdcard_listview"/> <include layout="@layout/sdcard_gridview"/> <include layout="@layout/morefile_menu_listview"/> <include layout="@layout/file_search_view"/> <include layout="@layout/main_footer"/> </RelativeLayout> <RelativeLayout xmlns:android="
http://schemas.android.com/apk/res/android
" xmlns:tools="
http://schemas.android.com/tools
" android:layout_width="fill_parent" android:layout_height="60dp" android:layout_alignParentBottom="true" android:background="#F6F6F6" android:id="@+id/main_relativelayout_footer" > <LinearLayout android:id="@+id/llWelcomeSmile" android:layout_width="fill_parent" android:layout_height="60dp" android:orientation="horizontal" android:gravity="center" > <ImageView android:id="@+id/ivWelcomeSmile" android:layout_width="wrap_content" android:layout_height="60dp" android:src="@drawable/smile" android:visibility="visible" /> <TextView android:id="@+id/tvWelcomeText" android:layout_width="wrap_content" android:layout_height="60dp" android:gravity="center_vertical" android:text=" 欢迎您使用XC文件管理器" android:textColor="#222222" android:visibility="visible" /> </LinearLayout> <GridView android:id="@+id/gvFooterView" android:layout_width="fill_parent" android:layout_height="60dp" android:layout_alignParentBottom="true" android:visibility="gone" android:listSelector="@drawable/meu_item_gb_blue2" android:background="#04AEDA" > </GridView> <GridView android:id="@+id/gvFileMenuGrid" android:layout_width="fill_parent" android:layout_height="60dp" android:layout_alignParentBottom="true" android:visibility="gone" android:listSelector="@drawable/meu_item_gb_blue2" android:background="#04AEDA" > </GridView> <GridView android:id="@+id/gvCopyAndMoveMenuGrid" android:layout_width="fill_parent" android:layout_height="60dp" android:layout_alignParentBottom="true" android:visibility="gone" android:listSelector="@drawable/meu_item_gb_blue2" android:background="#04AEDA" > </GridView> </RelativeLayout>
2.获取手机文件目录核心实现
/**
* 设置MainList的数据
*/
public void setMainlistData(){
PhoneDir dir = new PhoneDir();
dir.setImageID(R.drawable.sdcard);
dir.setStrDirName("存储卡/SD卡目录");
String dAllSpace = CommonUtils.getSdCardAllSpace();
String dFreeSpace = CommonUtils.getSdCardFreeSpace();
String strOther = ""+dFreeSpace +"GB可用/"+dAllSpace+"GB总计";
dir.setStrDirOther(strOther);
mainlist.add(dir);
dir = new PhoneDir();
dir.setImageID(R.drawable.systemdir);
dir.setStrDirName("系统目录/手机目录");
dir.setStrDirOther("请谨慎操作系统目录文件");
mainlist.add(dir);
}
/**
* 设置要显示的文件列表数据的数据
*/
public void setFileListData(String strPath){
String strShowPath;
if(strCurPath.contains(CommonUtils.getSdCardRoot())){
strShowPath = strCurPath.replaceAll(CommonUtils.getSdCardRoot(), "我的手机》存储卡");
}else{
strShowPath = strCurPath.replaceAll(FileUtils.getPhoneRoot(), "我的手机》系统目录");
}
strShowPath =strShowPath.replaceAll("/", "》");
tvShowPath.setText(strShowPath);
ArrayList fileList = FileUtils.getFilesOfCurDir(strPath);
FileItem item ;
File file ;
sdcardlist.clear();
sdcardGrid.clear();
for(int i = 0;i<fileList.size();i++){
item = new FileItem();
file = (File) fileList.get(i);
if(file.isDirectory()){//目录情况
item.setImageID(R.drawable.folder);
item.setbIsDir(true);
item.setnFileSize(0);
}else{//文件情况
item.setImageID(R.drawable.file);
item.setbIsDir(false);
item.setnFileSize(file.length());
}
item.setStrFilePath(file.getAbsolutePath());
item.setStrFileName(file.getName());
item.setStrDateTime(FileUtils.getFileLastModifiedTime(file));
sdcardlist.add(item);
sdcardGrid.add(item);
}
}
3.实现列表和缩略图方格UI布局样式切换
该功能主要是基于ListView和GridView进行UI 和数据适配器的更新切换,核心代码如下
if(mViewTypeStatus == Constant.VIEW_LISTVIEW)
{//ListView切换到GridView
llSdcardList.setVisibility(View.GONE);
llSdcardGrid.setVisibility(View.VISIBLE);
sdcardListView.setVisibility(View.GONE);
sdcardGridView.setVisibility(View.VISIBLE);
ImageView iv = (ImageView)view.findViewById(R.id.ivItemImage);
iv.setImageResource(R.drawable.footer_menu_list);
mViewTypeStatus = Constant.VIEW_GRIDVIEW;
setFileListData(strCurPath);
refreshData();
}
else{//GridView切换到ListView
llSdcardList.setVisibility(View.VISIBLE);
llSdcardGrid.setVisibility(View.GONE);
sdcardGridView.setVisibility(View.GONE);
sdcardListView.setVisibility(View.VISIBLE);
ImageView iv = (ImageView)view.findViewById(R.id.ivItemImage);
iv.setImageResource(R.drawable.footer_menu_grid);
mViewTypeStatus = Constant.VIEW_LISTVIEW;
setFileListData(strCurPath);
refreshData();
}
break;
/**
* 刷新当前页面(ListView或者GridView)数据
*/
public void refreshData(){
if(mViewTypeStatus == Constant.VIEW_LISTVIEW){
sdcardListAdapter = new SdcardListAdapter(MainActivity.this, sdcardlist);
sdcardListView.setAdapter(sdcardListAdapter);
}else {
sdcardGridAdapter = new SdcardGridAdapter(MainActivity.this, sdcardGrid);
sdcardGridView.setAdapter(sdcardGridAdapter);
}
if(sdcardlist.size() <= 0 ){
ToastUtils.ToastAtCenterPosition(MainActivity.this, "目录为空,没有任何文件!");
}
}
4.添加文件搜索功能
搜索功能是搜索文件目录下的所有符合搜索关键字的文件或者目录,相关初始化和核心实现代码如下:
/**
* 初始化 搜索框视图 即rlSearchView视图
*/
public void initSearchView(){
//初始化搜索框视图
rlSearchView = (RelativeLayout)findViewById(R.id.rlSearchView);
rlSearchView.setVisibility(View.GONE);
final EditText editText = (EditText)rlSearchView.findViewById(R.id.etSearchTextView);
editText.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// TODO Auto-generated method stub
String condition = editText.getText().toString();
if (condition.equals("")) {
setFileListData(strCurPath);
refreshData();
}else{
searchFilesList.clear();
searchSdCardFiles(new File(strCurPath));
setSearchListData(condition);
refreshData();
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
}
});
ImageView ivCancelSearch = (ImageView)rlSearchView.findViewById(R.id.ivCancelSearch);
ivCancelSearch.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
rlSearchView.setVisibility(View.GONE);
}
});
}
/**
* 遍历SD卡
*/
public void searchSdCardFiles(File root){
File files[] = root.listFiles();
if(files != null)
for(File f:files){
if(f.isDirectory()){
searchFilesList.add(f);
searchSdCardFiles(f);
}
else{
searchFilesList.add(f);
}
}
}
/**
* 设置要显示的搜索出来的文件列表数据的数据
*/
public void setSearchListData(String condition){
String strShowPath = "搜索结果:";
tvShowPath.setText(strShowPath);
FileItem item ;
File file ;
sdcardlist.clear();
for(int i = 0;i<searchFilesList.size();i++){
item = new FileItem();
file = (File) searchFilesList.get(i);
if(!file.getAbsolutePath().contains(condition))
continue;
if(file.isDirectory()){//目录情况
item.setImageID(R.drawable.folder);
item.setbIsDir(true);
item.setnFileSize(0);
}else{//文件情况
item.setImageID(R.drawable.file);
item.setbIsDir(false);
item.setnFileSize(file.length());
}
item.setStrFilePath(file.getAbsolutePath());
item.setStrFileName(file.getName());
item.setStrDateTime(FileUtils.getFileLastModifiedTime(file));
sdcardlist.add(item);
}
}
5.由于本项目代码量比较多,在此就不把其他所有功能都一一罗列了,其他的常规的复制,剪切,新建文件等功能,以及版权和检查更新弹窗功能实现,请大家下载源码具体,谢谢大家,希望对大家有所帮助。
四、项目代码目录结构

注:本文著作权归作者,由demo大师发表,拒绝转载,转载需要作者授权
XC文件管理器-打造优美易用的文件管理器的更多相关文章
- [转]教大家如何打造使用Tcpview(tcp查看器
原文地址:教大家如何打造使用Tcpview(tcp查看器)作者:jybasenet3 一玩 VS 对战平台的同学有一次发现了一个可以踢人的方法,就是用 TcpView 把那个连 接关掉.后来VS ...
- 使用Vitamio打造自己的Android万能播放器(6)——在线播放(播放列表)
前言 新版本的VPlayer由设计转入开发阶段,预计开发周期为一个月,这也意味着新版本的Vitamio将随之发布,开发者们可以和本系列文章一样,先开发其他功能.本章内容为"在线视频播放列表& ...
- 使用Vitamio打造自己的Android万能播放器(5)——在线播放(播放优酷视频)
前言 为了保证每周一篇的进度,又由于Vitamio新版本没有发布, 决定推迟本地播放的一些功能(截图.视频时间.尺寸等),跳过直接写在线播放部分的章节.从Vitamio的介绍可以看得出,其支持http ...
- 使用Vitamio打造自己的Android万能播放器(4)——本地播放(快捷搜索、数据存储)
前言 关键字:Vitamio.VPlayer.Android播放器.Android影音.Android开源播放器 本章节把Android万能播放器本地播放的主要功能(缓存播放列表和A-Z快速查询功能) ...
- 使用Vitamio打造自己的Android万能播放器(3)——本地播放(主界面、播放列表)
前言 打造一款完整可用的Android播放器有许多功能和细节需要完成,也涉及到各种丰富的知识和内容,本章将结合Fragment.ViewPager来搭建播放器的主界面,并实现本地播放基本功能.系列文章 ...
- 使用Vitamio打造自己的Android万能播放器(2)—— 手势控制亮度、音量、缩放
前言 本章继续完善播放相关播放器的核心功能,为后续扩展打好基础. 声明 欢迎转载,但请保留文章原始出处:) 博客园:http://www.cnblogs.com 农民伯伯: http://ove ...
- 使用Vitamio打造自己的Android万能播放器(7)——在线播放(下载视频)
前言 本章将实现非常实用的功能——下载在线视频.涉及到多线程.线程更新UI等技术,还需思考产品的设计,如何将新加的功能更好的融入到现有的产品中,并不是简单的加一个界面就行了,欢迎大家交流产品设计和技术 ...
- 端云协同,打造更易用的AI计算平台
内容来源:华为开发者大会2021 HMS Core 6 AI技术论坛,主题演讲<端云协同,HUAWEI HiAI Foundation打造更易用的AI计算平台>. 演讲嘉宾:华为海思AI技 ...
- 如何用vue打造一个移动端音乐播放器
写在前面 没错,这就是慕课网上的那个vue音乐播放器,后台是某音乐播放器的线上接口扒取,虽然这类项目写的人很多,但不得不说这还是个少有的适合vue提升的好项目,做这个项目除了想写一个比较大并且功能复杂 ...
随机推荐
- Backbone.js 中使用 Model
前面几篇 Backbone.js 的例子中有使用到 template, 及数据的填充,其实这已经很接近 Model 了.现在来学习怎么创建自己的 Model 类,并简单的使用.Backbone.js ...
- 简短介绍 C# 6 的新特性
几周前我在不同的地方读到了有关C#6的一些新特性.我就决定把它们都收集到一起,如果你还没有读过,就可以一次性把它们都过一遍.它们中的一些可能不会如预期那样神奇,但那也只是目前的更新. 你可以通过下载V ...
- C#与Visual Basic的异与同
C#是一种高级程序设计语言,是一种安全.稳定.简单.优雅的编程语言,它与Visual Basic有很多相同的地方,同时也有很多不同的地方.我们今天这篇博客本着学习C#的原则,着重介绍一下C#与Visu ...
- 我对android 软件栈了解
android 软件栈如图所示: Android平台的核心是Linux内核,它负责设备驱动程序.资源访问.电源管理和完成其他操作系统的职责.提供的设备驱动程序包括显示器.照相机,键盘.WiFi.闪存. ...
- 微信小程序阿里云服务器https搭建
已更新 2018-11-20 1.什么是https?HTTPS(全称:安全套接字层上的超文本传输协议),是以安全为目标的HTTP通道,简单讲是HTTP的安全版.即HTTP下加入SSL层,HTTPS ...
- NAS 网络附属存储
本文内容 NAS NAS 功能 SAN 与 NAS 区别 NAS 底层协议 NAS 全球主要厂商 参考资料 NAS NAS(Network Attached Storage,网络附属存储)一种特殊 ...
- android中使用Nine-Patch图片
android中可以把图片进行处理,如果图片被拉伸的话,允许让图片部分区域不拉伸,部分区域拉伸.这个功能非常好,比如聊天的气泡,如果整个气泡被拉伸的话,会非常的丑. 老版的sdk中提供的有draw9p ...
- iOS9中找不到XXX.dylib 与 is unavailable no availabel on ios (app extension) - use view controller 的解决办法
在 iOS9 中现在找不到 XXX.dylib 了,比如libz.tbd 如果要用到 libz.dylib,可以用下面的办法,来自 Stack Overflow. Go to Build Phase ...
- iOS编程(双语版) - 视图 - Transform(转换)
视图有一个transform属性,它描述了应该如何绘制该视图. 该属性是CGAffineTransform结构体,它代表了3 x 3的变换矩阵(线性代数). 下面的代码让两个矩形视图旋转45度 (Ob ...
- JQuery 之 动态加载JS或JS文件
如果用jquery的append直接加载script标签的话,会报错的. 1.可以用 document.write() 实现加载动态JS代码. 2.可以用 getScript() 函数实现加载JS文件 ...