效果图:
首先manifest中加入可以读取SD卡的权限,如下
<!-- 判断是否存在文件系统SD卡 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<!-- 允许当前应用程序读取SD卡文件 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!-- 允许当前程序向SD卡写入数据 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
1.建立布局
title_layout:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="返回"
android:id="@+id/btn_left"/>
<TextView
android:id="@+id/tv_title"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:textSize="22sp"
android:gravity="center_horizontal"
android:text="文件管理器"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="添加"
android:id="@+id/btn_right"/>
</LinearLayout>
activity_main
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
>
<include layout="@layout/title_layout"/>
<ListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/lv_list"
android:scrollbars="none"
android:divider="#ff0000"
android:dividerHeight="0.1dp"
android:cacheColorHint="#00000000"/>
</LinearLayout>
2.建立文件对象
public class File_item {
//图片ID
private int drawable_int;
//文件名称
private String file_name;
public int getDrawable_int() {
return drawable_int;
}
public void setDrawable_int(int drawable_int) {
this.drawable_int = drawable_int;
}
public String getFile_name() {
return file_name;
}
public void setFile_name(String file_name) {
this.file_name = file_name;
}
public File_item() {
super();
}
public File_item(int drawable_int, String file_name) {
super();
this.drawable_int = drawable_int;
this.file_name = file_name;
}
@Override
public String toString() {
return "File_item [drawable_int=" + drawable_int + ", file_name="
+ file_name + "]";
}
}
3.给文件列表建立item_layout布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:padding="10dp"
android:orientation="horizontal" >
<ImageView
android:id="@+id/iv_image"
android:layout_width="30dp"
android:layout_height="40dp"
android:src="@drawable/files" />
<TextView
android:id="@+id/tv_name"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="11111"
android:textColor="#ccbbbf"
android:textSize="20sp" />
</LinearLayout>
4.建立文件列表适配器
import java.util.List;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
public class MyFileAdapter extends BaseAdapter {
private Context context;
private List<File_item> oList;
private LayoutInflater inflater;
public MyFileAdapter(Context context, List<File_item> oList) {
this.context = context;
this.oList = oList;
this.inflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return oList.size();
}
@Override
public Object getItem(int position) {
return oList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View v, ViewGroup parent) {
ViewHolder holder;
if (v == null) {
holder = new ViewHolder();
v = inflater.inflate(R.layout.item_layout, null);
holder.iv_image = (ImageView) v.findViewById(R.id.iv_image);
holder.tv_name = (TextView) v.findViewById(R.id.tv_name);
v.setTag(holder);
} else {
holder = (ViewHolder) v.getTag();
}
//这里我给文件管理器设置了一个动画,使用的补间动画
Animation animation=AnimationUtils.loadAnimation(context, R.anim.translate_anim);
v.startAnimation(animation);
holder.iv_image.setImageResource(oList.get(position).getDrawable_int());
holder.tv_name.setText(oList.get(position).getFile_name());
return v;
}
private class ViewHolder {
ImageView iv_image;
TextView tv_name;
}
}
以上我给文件列表弄了一个动画下面是动画的xml文件,不懂动画的可以去我主页看看
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="0.0"
android:toXDelta="50%"
android:duration="1000"
android:repeatCount="1"
android:repeatMode="restart"
android:interpolator="@android:anim/linear_interpolator">
</translate>
5.建立文件的读取写入的工具类:
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
public class StreamUtil {
public static String getString(InputStream is) throws IOException{
String info="";
byte[] by=new byte[1024];
StringBuilder builder=new StringBuilder();
int read_int=-1;
while ((read_int=is.read(by))!=-1) {
String line=new String(by,0,read_int);
builder.append(line);
}
is.close();
info=builder.toString();
return info;
}
public static void insert_content(String content,File currentFile)
{
try {
RandomAccessFile randomAccessFile=new RandomAccessFile(currentFile, "rw");
randomAccessFile.seek(currentFile.length());
randomAccessFile.write(content.getBytes());
randomAccessFile.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
6.建立主Activity
public class MainActivity extends Activity {
private Button btn_left, btn_right;
private ListView lv_list;
// 用于保存当前文件路径
private File currentFile;
// 用于保存子文件列表
private File[] listFile;
// 数据源
private List<File_item> oList = new ArrayList<File_item>();
//适配器
private MyFileAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 在加载布局之前执行
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
btn_left = (Button) this.findViewById(R.id.btn_left);
btn_right = (Button) this.findViewById(R.id.btn_right);
lv_list = (ListView) this.findViewById(R.id.lv_list);
String state = Environment.getExternalStorageState();
// 判断SD卡是否存在
if (state.equals(Environment.MEDIA_MOUNTED)) {
// Storage/SDCard/
currentFile = Environment.getExternalStorageDirectory();
show_File_List(currentFile);
}
lv_list.setOnItemClickListener(listener);
lv_list.setOnItemLongClickListener(listener3);
btn_left.setOnClickListener(listener2);
btn_right.setOnClickListener(listener2);
}
//listView点击事件
private OnItemClickListener listener = new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
//得到当前点击的File
currentFile = listFile[position];
//刷新列表
show_File_List(currentFile);
}
};
//listView长按删除文件
private OnItemLongClickListener listener3 = new OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view,
int position, long id) {
// 删除文件
listFile[position].delete();
//移除集合
oList.remove(position);
//重新显示在ListView上
show_File_List(currentFile);
return true;
}
};
//title_layout的返回与添加的点击事件
private OnClickListener listener2 = new OnClickListener() {
@Override
public void onClick(View v) {
switch (v.getId()) {
//返回到上一级目录
case R.id.btn_left:
//得到上一级目录地址
File file = currentFile.getParentFile();
currentFile = file;
//重新显示在listView上
show_File_List(currentFile);
break;
case R.id.btn_right:
// 弹出对话框,选择添加的类型
show_dialog();
break;
default:
break;
}
}
};
// 对话框,用于选择添加文件的类型
public void show_dialog() {
Builder builder = new Builder(this);
builder.setTitle("选择添加的类型");
builder.setItems(new String[] { "添加文件夹", "添加文本" },
new AlertDialog.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which) {
case 0:
// 弹出添加文件夹的对话框
add_files_dialog();
break;
case 1:
// 弹出添加文件的对话
add_file_dialog();
break;
default:
break;
}
}
});
builder.create();
builder.show();
}
private EditText et_add_files;
// 用于添加文件夹对话框
public void add_files_dialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("添加文件夹");
LayoutInflater inflater = getLayoutInflater().from(this);
View view = inflater.inflate(R.layout.add_files_layout, null);
et_add_files = (EditText) view.findViewById(R.id.et_add_files);
builder.setView(view);
builder.setPositiveButton("确定", new AlertDialog.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// stroge/sdcard/111
String files_name = et_add_files.getText().toString();
//在当前路径currentFiel创建files_name的文件夹
File file = new File(currentFile, files_name);
// 判断当前文件夹路径是否存在
if (!file.exists()) {
// 如果不存在,创建文件夹
file.mkdir();
// 刷新列表
show_File_List(currentFile);
} else {
Toast.makeText(MainActivity.this, "当前文件夹已经存在", Toast.LENGTH_SHORT).show();
}
}
});
builder.setNegativeButton("取消", null);
builder.create();
builder.show();
}
private EditText et_add_file, et_file_content;
// 用于添加文件对话框
public void add_file_dialog() {
// 文件名称。。。文件内容
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("添加文件");
LayoutInflater inflater = getLayoutInflater();
View view = inflater.inflate(R.layout.add_file_layout, null);
et_add_file = (EditText) view.findViewById(R.id.et_add_file);
et_file_content = (EditText) view.findViewById(R.id.et_file_content);
builder.setView(view);
builder.setPositiveButton("确定", new AlertDialog.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// 获取用户输入的文件名称以及内容
String file_name = et_add_file.getText().toString();
String file_content = et_file_content.getText().toString();
//在当前路径currentFiel创建files_name的文件夹
File file = new File(currentFile, file_name);
// 判断当前文件夹的问价是否存在,如果不存在则创建该文件,并且写入数据
if (!file.exists()) {
try {
// 创建新文件
file.createNewFile();
// 写入数据
StreamUtil.insert_content(file_content, file);
// 刷新列表
show_File_List(currentFile);
} catch (Exception e) {
}
}
}
});
builder.setNegativeButton("取消", null);
builder.create();
builder.show();
}
// 查找当前文件路径下的子文件,并且显示在listView列表上
public void show_File_List(File cFile) {
// 判断当前路径下是否有子文件
if (cFile.isDirectory()) {
// 判断集合是否为空
if (oList.size() > 0) {
oList.clear();
}
//获取该文件夹下的文件夹和文件
listFile = cFile.listFiles();
//遍历文件夹
for (int i = 0; i < listFile.length; i++) {
//创建文件夹对象
File_item item = new File_item();
//判断文件夹下的是文件夹吗?
if (listFile[i].isDirectory()) {
//如果是文件夹将它设置成文件夹的图标
item.setDrawable_int(R.drawable.files);
} else {
//否则是文件,然后得到文件的名称
// listFile[i]:Storage/SDCard//text.txt
// name:text.txt
String name = listFile[i].getName();
// names:[text,txt]
//使用split()以.分割文件的名称
String[] names = name.split("\\.");
//如果是以txt结尾设置成文件的图标,否则是zip设置成压缩吧的图标
if (names[1].equals("txt")) {
item.setDrawable_int(R.drawable.file);
} else if (names[1].equals("zip")) {
item.setDrawable_int(R.drawable.zip_file);
}
}
// 添加文件名称
item.setFile_name(listFile[i].getName());
//将文件夹对象添加到集合
oList.add(item);
}
// 单例模式
if (adapter == null) {
adapter = new MyFileAdapter(this, oList);
lv_list.setAdapter(adapter);
} else {
// 刷新适配器
adapter.notifyDataSetChanged();
}
} else {
// 判断当前的文件是否是txt文件,读取txt文件内容
String name = currentFile.getName();
//使用split()以.分割文件的名称
String[] infos = name.split("\\.");
//是文件的话就读取内容
if (infos[1].equals("txt")) {
// 通过文本路径读取SD卡txt文件
try {
FileInputStream fis = new FileInputStream(currentFile);
String infoString = StreamUtil.getString(fis);
Toast.makeText(this, infoString, Toast.LENGTH_SHORT).show();
} catch (Exception e) {
e.printStackTrace();
}
} else {
Toast.makeText(this, "当前文件不能打开", Toast.LENGTH_SHORT).show();
}
}
}
}
最后是dialog的布局:
添加文件add_file_layout
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<EditText
android:id="@+id/et_add_file"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入文件的名称" />
<EditText
android:id="@+id/et_file_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="left|top"
android:hint="请输入文件的内容"
android:lines="5" />
</LinearLayout>
添加文件夹add_files_layout
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<EditText
android:id="@+id/et_add_files"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入新建文件夹的名称" />
</LinearLayout>
这篇文章基本都写了注释,写的比较辛苦,给个赞呗,
最后还不会的读者赶快敲起来吧