转自:http://www.linuxidc.com/Linux/2011-10/44521.htm

今天拿这个改了一个 路径选择器

=======================================

1. Android文件管理器介绍

Android系统并不自带文件管理器,但是很多情况下,我们有诸如从SD中打开文件的需要,就必须借助三方开发的资源管理器,常用的有AndExplorer等。这种情况下发布后,用户还需要安装依赖的软件,非常麻烦。下面介绍在代码中实现资源管理器,只需要一百行左右的一个类即可以最常用的文件选择功能。

2. 相关知识

文件管理器一般以固定大小的对话框的方式出现,使用ListView作为文件目录的显示载体。点选目录测进入,点选文件则将所选择文件的Uri返回给调用它的Activity。ListView的使用是实现这个功能的重点。

3. 例程

1) 功能

当用户点击按钮时,调出固定大小的文件管理器,默认显示的目录是SD卡的根目录。用户选择文件后,在界面上显示该文件的路径。

2) 可从此处下载可独立运行的代码

免费下载地址在 http://linux.linuxidc.com/

用户名与密码都是www.linuxidc.com

具体下载目录在 /pub/Android源码集锦/2011年/10月/Android文件管理器的源码实现/

3) 核心代码及说明

a) 调用资源管理器

Intent intent = new Intent();

intent.putExtra("explorer_title",

getString(R.string.dialog_read_from_dir)); // 设置文件管理器标题

intent.setDataAndType(Uri.fromFile(new File("/sdcard")), "*/*"); // 设置起始文件夹和文件类型

intent.setClass(MyActivity.this, ExDialog.class);

startActivityForResult(intent, REQUEST_EX);

b) 从资源管理器接收数据

protected void onActivityResult(int requestCode, int resultCode,

Intent intent) {

String path;

if (resultCode == RESULT_OK) {

if (requestCode == REQUEST_EX) {

Uri uri = intent.getData(); // 接收用户所选文件的路径

TextView text = (TextView) findViewById(R.id.text);

text.setText("select: " + uri); // 在界面上显示路径

}

}

}

c) 文件管理器类的实现

public class ExDialog extends ListActivity { // ListActivity自带List控件

private List<Map<String, Object>> mData;

private String mDir = "/sdcard";

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

Intent intent = this.getIntent();

Bundle bl = intent.getExtras();

String title = bl.getString("explorer_title"); // 接收标题内容

Uri uri = intent.getData(); // 接收起始目录

mDir = uri.getPath(); // 设置起始目录

setTitle(title);

mData = getData(); // 向链表mData填充目录的数据

MyAdapter adapter = new MyAdapter(this);

setListAdapter(adapter); // 设置MyAdapter类为ListView控件提供数据

WindowManager m = getWindowManager();

Display d = m.getDefaultDisplay();

LayoutParams p = getWindow().getAttributes();

p.height = (int) (d.getHeight() * 0.8);

p.width = (int) (d.getWidth() * 0.95);

getWindow().setAttributes(p); // 设置对话框为固定大小,不因进出目录变化

}

private List<Map<String, Object>> getData() { // 将目录数据填充到链表中

List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();

Map<String, Object> map = null;

File f = new File(mDir); // 打开当前目录

File[] files = f.listFiles(); // 获取当前目录中文件列表

if (!mDir.equals("/sdcard")) { // 不充许进入/sdcard上层目录

map = new HashMap<String, Object>(); // 加返回上层目录项

map.put("title", "Back to ../");

map.put("info", f.getParent());

map.put("img", R.drawable.ex_folder);

list.add(map);

}

if (files != null) { // 将目录中文件填加到列表中

for (int i = 0; i < files.length; i++) {

map = new HashMap<String, Object>();

map.put("title", files[i].getName());

map.put("info", files[i].getPath());

if (files[i].isDirectory()) // 按不同类型显示不同图标

map.put("img", R.drawable.ex_folder);

else

map.put("img", R.drawable.ex_doc);

list.add(map);

}

}

return list;

}

// 响应用户点击列表项的事件

@Override

protected void onListItemClick(ListView l, View v, int position, long id) {

Log.d("MyListView4-click", (String) mData.get(position).get("info"));

if ((Integer) mData.get(position).get("img") == R.drawable.ex_folder) {

mDir = (String) mData.get(position).get("info");

mData = getData(); //点击目录时进入子目录

MyAdapter adapter = new MyAdapter(this);

setListAdapter(adapter);

} else { // 点击文件时关闭文件管理器,并将选取结果返回

finishWithResult((String) mData.get(position).get("info"));

}

}

public final class ViewHolder { // 定义每个列表项所含内容

public ImageView img; // 显示图片ID

public TextView title; // 文件目录名

public TextView info; // 文件目录描述

}

public class MyAdapter extends BaseAdapter { // 实现列表内容适配器

private LayoutInflater mInflater;

public MyAdapter(Context context) {

this.mInflater = LayoutInflater.from(context);

}

public int getCount() { // 获取列表项个数

return mData.size();

}

public Object getItem(int arg0) {

return null;

}

public long getItemId(int arg0) {

return 0;

}

// 设置每个列表项的显示

public View getView(int position, View convertView, ViewGroup parent) {

ViewHolder holder = null;

if (convertView == null) {

holder = new ViewHolder();

convertView = mInflater.inflate(R.layout.listview, null); // 设置列表项的布局

holder.img = (ImageView) convertView.findViewById(R.id.img);

holder.title = (TextView) convertView.findViewById(R.id.title);

holder.info = (TextView) convertView.findViewById(R.id.info);

convertView.setTag(holder);

} else {

holder = (ViewHolder) convertView.getTag();

}

holder.img.setBackgroundResource((Integer) Data.get(position).get(

"img")); // 根据位置position设置具体内容

holder.title.setText((String) Data.get(position).get("title"));

holder.info.setText((String) mData.get(position).get("info"));

return convertView;

}

}

private void finishWithResult(String path) {

Bundle conData = new Bundle();

conData.putString("results", "Thanks Thanks");

Intent intent = new Intent(); // 以intent的方式将结果返回调用类

intent.putExtras(conData);

Uri startDir = Uri.fromFile(new File(path));

intent.setDataAndType(startDir,

"vnd.Android.cursor.dir/lysesoft.andexplorer.file");

setResult(RESULT_OK, intent);

finish();

}

};

更多相关文章

  1. NPM 和webpack 的基础使用
  2. 【阿里云镜像】使用阿里巴巴DNS镜像源——DNS配置教程
  3. 在android平台上编译libpcap-0.9.8 和 jnetpcap-1.2.rc1
  4. 在android平台上编译libpcap-0.9.8 和 jnetpcap-1.2.rc1
  5. Android(安卓)Manifest文件中meta-data的配置读取
  6. [转]Android文件管理器介绍
  7. Android(安卓)模板编写
  8. Android(安卓)控件之Gallery图片集
  9. android使用pull解析器来解析和生成xml文件

随机推荐

  1. Android Firewall(防火墙) AndFire 首发
  2. Android加密算法:AES、Base64加密算法
  3. android Socket实现简单聊天小程序
  4. Android(安卓)CheckBox设置背景selector
  5. Android判断apk是否存在
  6. Android(安卓)自定义控件属性
  7. I.MX6 Android(安卓)backlight modify by
  8. Android的各种Drawable详解
  9. Android判断APP是在前台还是后台
  10. Scrollview和RecyclerView滑动冲突问题解