Android的數據存儲和IO-SD卡文件浏覽器
創建項目:SDFileExplorer
運行項目結果:
布局文件:main.xml
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- >
- <!-- 顯示當前路徑的的文本框 -->
- <TextView
- android:id="@+id/path"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_gravity="center_horizontal"
- />
- <!-- 列出當前路徑下所有文件的ListView -->
- <ListView
- android:id="@+id/list"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:divider="#000"
- />
- <!-- 返回上一級目錄的按鈕 -->
- <Button android:id="@+id/parent"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:background="@drawable/home"
- android:paddingTop="20dp"
- android:layout_gravity="center"/>
- </LinearLayout>
列表布局文件: line.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="horizontal"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- >
- <!-- 定義一個ImageView,用於作為列表項的一部分。 -->
- <ImageView android:id="@+id/icon"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:paddingLeft="10dp"
- />
- <!-- 定義一個TextView,用於作為列表項的一部分。 -->
- <TextView android:id="@+id/file_name"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textSize="16dp"
- android:gravity="center_vertical"
- android:paddingLeft="10dp"
- android:paddingTop="10dp"
- android:paddingBottom="10dp"
- />
- </LinearLayout>
Activity文件:SDFileExplorer.java
- package wwj.sdfileexplorer;
-
- import java.io.File;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
-
- import android.app.Activity;
- import android.os.Bundle;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.AdapterView;
- import android.widget.AdapterView.OnItemClickListener;
- import android.widget.Button;
- import android.widget.ListView;
- import android.widget.SimpleAdapter;
- import android.widget.TextView;
- import android.widget.Toast;
-
- public class SDFileExplorer extends Activity {
-
- ListView listView;
- TextView textView;
- //記錄當前的父文件夾
- File currentParent;
- //記錄當前目錄路徑下的所有文件的文件數組
- File[] currentFiles;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- //獲取列出全部文件的ListView
- listView = (ListView)findViewById(R.id.list);
- textView = (TextView)findViewById(R.id.path);
- //獲取系統的SD卡的目錄
- File root = new File("/mnt/sdcard/");
- //如果SD卡存在
- if(root.exists()){
- currentParent = root;
- currentFiles = root.listFiles();
- //使用當前目錄下的全部文件、文件夾來填充ListView
- inflateListView(currentFiles);
- }
- //為ListView的列表項的單擊事件綁定監聽器
- listView.setOnItemClickListener(new OnItemClickListener() {
-
- public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
- long arg3) {
- // TODO Auto-generated method stub
- //用戶單擊了文件,直接返回,不做任何處理
- if(currentFiles[arg2].isFile())
- return;
- //獲取用戶單擊的文件夾下的所有文件
- File[] tmp = currentFiles[arg2].listFiles();
- if(tmp == null || tmp.length == 0){
- Toast.makeText(SDFileExplorer.this, "當前路徑不可訪問或該路徑下沒有文件", 20000).show();
- }
- else{
- //獲取用戶單擊的列表項對應的文件夾,設為當前的父文件夾
- currentParent = currentFiles[arg2];
- //保存當前的父文件夾內的全部文件和文件夾
- currentFiles = tmp;
- //再次更新ListView
- inflateListView(currentFiles);
- }
- }
- });
- //獲取上一級目錄的按鈕
- Button parent = (Button)findViewById(R.id.parent);
- parent.setOnClickListener(new OnClickListener() {
-
- public void onClick(View v) {
- // TODO Auto-generated method stub
- try{
- if(!currentParent.getCanonicalPath().equals("/mnt/sdcard")){
- //獲取上級目錄
- currentParent = currentParent.getParentFile();
- //列出當前目錄下所有文件
- currentFiles = currentParent.listFiles();
- //再次更新ListView
- inflateListView(currentFiles);
- }
- }catch (Exception e) {
- // TODO: handle exception
- e.printStackTrace();
- }
- }
- });
- }
- private void inflateListView(File[] files){
- //創建一個List集合,List集合的元素是Map
- List<Map<String, Object>> listItems = new ArrayList<Map<String, Object>>();
- for(int i = 0; i < files.length; i++){
- Map<String, Object> listItem = new HashMap<String, Object>();
- //如果當前File是文件夾,使用floder圖標;否則使用file圖標
- if(files[i].isDirectory()){
- listItem.put("icon", R.drawable.folder);
- }
- else{
- listItem.put("icon", R.drawable.file);
- }
- listItem.put("fileName", files[i].getName());
- //添加List項
- listItems.add(listItem);
- }
- //創建一個SimpleAdapter
- SimpleAdapter simpleAdapter = new SimpleAdapter(this, listItems, R.layout.line,
- new String[]{"icon","fileName"}, new int[]{R.id.icon, R.id.file_name});
- //為ListView設置Adapter
- listView.setAdapter(simpleAdapter);
- try{
- textView.setText("當前路徑為: " + currentParent.getCanonicalPath());
- }catch (Exception e) {
- // TODO: handle exception
- e.printStackTrace();
- }
- }
- }