`

Android中文件选择器的实现

 
阅读更多


转载请注明出处:http://blog.csdn.net/qinjuning

 


今天给大家分享下文件选择器的作用 , 具体就是获取用户在在SD卡选中的文件/文件夹路径 ,类似于C#中

OpenFileDialog控件(对C#的一站式开发还是念念不忘)。功能实现起来比较简单,主要是帮助大家节省开发时间。

网上流传较广的一个成品如下 <[Android实例]文件选择器>, 本文也是根据上面的成品修改而成,使其更易

理解,效率更高。除此之外,主要特色有:

1、我们监听了用户按下Back键的事件,使其返回上一层目录;

2、针对不同的文件类型(文件vs文件夹 , 目标文件vs其他文件)做了特殊处理。

知识点一、 File 类的使用

文件选择器的主要功能是:浏览文件\文件夹、文件类型等;都是通过Java File类来实现的。

关于File类的使用,请参考如下博客:

<<来自java文档 File类>>

<<JavaFile类>>

 

 

 

 


知识点二、调用方法说明

使用了startActivityForResult()发起调用以及onActivityResult()方法接受回调后的信息。

截图如下:




其他的也没什么好说了,大家看看代码注释吧~~ so easy - - 。


FileChooserActivity.java 实现文件选择的类 。

public class CopyOfFileChooserActivity extends Activity {
	
	private String mSdcardRootPath ;  //sdcard 根路径
	private String mLastFilePath ;    //当前显示的路径
	
	private ArrayList<FileInfo> mFileLists  ;
	private FileChooserAdapter mAdatper ;
	
	//配置适配器
	private void setGridViewAdapter(String filePath) {
		updateFileItems(filePath);
		mAdatper = new FileChooserAdapter(this , mFileLists);
		mGridView.setAdapter(mAdatper);
	}
	//根据路径更新数据,并且通知Adatper数据改变
	private void updateFileItems(String filePath) {
		mLastFilePath = filePath ;
		mTvPath.setText(mLastFilePath);
		
		if(mFileLists == null)
			mFileLists = new ArrayList<FileInfo>() ;
		if(!mFileLists.isEmpty())
			mFileLists.clear() ;
		
		File[] files = folderScan(filePath);
		if(files == null) 
			return ;
		for (int i = 0; i < files.length; i++) {
			if(files[i].isHidden())  // 不显示隐藏文件
				continue ;
			
			String fileAbsolutePath = files[i].getAbsolutePath() ;
			String fileName = files[i].getName();
		    boolean isDirectory = false ;
			if (files[i].isDirectory()){
				isDirectory = true ;
			}
		    FileInfo fileInfo = new FileInfo(fileAbsolutePath , fileName , isDirectory) ;
			//添加至列表
		    mFileLists.add(fileInfo);
		}
		//When first enter , the object of mAdatper don't initialized
		if(mAdatper != null)
		    mAdatper.notifyDataSetChanged();  //重新刷新
	}
	//获得当前路径的所有文件
	private File[] folderScan(String path) {
		File file = new File(path);
		File[] files = file.listFiles();
		return files;
	}
	private AdapterView.OnItemClickListener mItemClickListener = new OnItemClickListener() {
		public void onItemClick(AdapterView<?> adapterView, View view, int position,
				long id) {
			FileInfo fileInfo = (FileInfo)(((FileChooserAdapter)adapterView.getAdapter()).getItem(position));
			if(fileInfo.isDirectory())   //点击项为文件夹, 显示该文件夹下所有文件
				updateFileItems(fileInfo.getFilePath()) ;
			else if(fileInfo.isPPTFile()){  //是ppt文件 , 则将该路径通知给调用者
			    Intent intent = new Intent();
			    intent.putExtra(EXTRA_FILE_CHOOSER, fileInfo.getFilePath());
			    setResult(RESULT_OK , intent);
			    finish();
			}
			else {   //其他文件.....
				toast(getText(R.string.open_file_error_format));
			}
		}
	};
	public boolean onKeyDown(int keyCode , KeyEvent event){
		if(event.getAction() == KeyEvent.ACTION_DOWN && event.getKeyCode()
			== KeyEvent.KEYCODE_BACK){
			backProcess();   
			return true ;
		}
		return super.onKeyDown(keyCode, event);
	}
	//返回上一层目录的操作
	public void backProcess(){
		//判断当前路径是不是sdcard路径 , 如果不是,则返回到上一层。
		if (!mLastFilePath.equals(mSdcardRootPath)) {  
			File thisFile = new File(mLastFilePath);
			String parentFilePath = thisFile.getParent();
			updateFileItems(parentFilePath);
		} 
		else {   //是sdcard路径 ,直接结束
			setResult(RESULT_CANCELED);
			finish();
		}
	}
}

 

 

界面依旧很丑陋,囧 ,大家可以根据需要在此基础上添加功能 。 示例代码下载地址:

http://download.csdn.net/detail/qinjuning/4908609 (源代码下载)





 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics