Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 15、Android數據存儲——SharedPreferences及SDCard

15、Android數據存儲——SharedPreferences及SDCard

編輯:關於Android編程

一、數據存儲選項:Data Storage ——Storage Options【重點】
1、Shared Preferences
Store private primitive data in key-value pairs.
保存簡單的鍵值對數據。
2、Internal Storage
Store private data on the device memory.
在手機內存中保存不對外共享的信息。
3、External Storage
Store public data on the shared external storage.
在外部存儲設備上保存公共的數據信息。主要指保存在SDCard上。
4、SQLite Databases
Store structured data in a private database.
將結構化的數據保存進數據庫。
5、Network Connection
Store data on the web with your own network server.
將數據保存到自己的遠程服務器上。
【備注:】
  • 內部存儲空間十分有限,因而顯得可貴,另外,它也是系統本身和系統應用程序主要的數據存儲所在地,一旦內部存儲空間耗盡,手機也就無法使用了。
  • 所以對於內部存儲空間,我們要盡量避免使用。Shared Preferences和SQLite數據庫都是存儲在內部存儲空間上的。內部存儲一般用Context來獲取和操作。
  • getFilesDir()獲取你app的內部存儲空間,相當於你的應用在內部存儲上的根目錄。
  • 最容易混淆的是外部存儲,如果說pc上區分出外部存儲和內部存儲的話,那麼自帶的硬盤算是內部存儲,U盤或者移動硬盤算是外部存儲,因此我們很容易帶著這樣的理解去看待安卓手機,認為機身固有存儲是內部存儲,而擴展的SDCard卡是外部存儲。比如Nexus 4有16G的內部存儲,普通消費者可以這樣理解,但是安卓的編程中不能,這16GB仍然是外部存儲。
  二、SharedPreferences: (一)、概念: SharedPreferences是Android系統提供的一個通用的數據持久化框架,用於存儲和讀取key-value類型的原始基本數據類型對,目前支持string、int、long、float、boolean等基本類型的存儲,對於自定義的對象數據類型,無法使用SharedPreferences來存儲。 SharedPreferences主要用於存儲系統的配置信息。例如上次登錄的用戶名,上次最後設置的配置信息(如:是否打開音效、是否使用振動,小游戲的玩家積分等)。當再次啟動程序後依然保持原有設置。SharedPreferences用鍵值對方式存儲,方便寫入和讀取。   (二)、使用SharedPreferences的步驟: 1、獲取SharedPreferences對象; SharedPreferences本身是一個接口,無法直接創建實例,通過Context的getSharedPreferences(String name, int mode)方法來獲取實例。該方法的第二個參數為文件讀寫的操作模式。 2、調用edit()方法獲取SharedPreferences.Editor; 3、通過SharedPreferences.Editor接口提供的put()方法對SharedPreferences進行更新; 4、調用SharedPreferences.Editor的commit()方法,將更新提交到SharedPreferences中。     (三)、三種方法來得到SharedPreferences對象: 1、通過Context的getSharedPreferences(Stringname, int mode)方法來獲取: SharedPreferences本身是一個接口,無法直接創建實例,通過Context的getSharedPreferences (String name, int mode)方法來獲取實例。該方法有兩個參數,第一個參數用於指定SharedPreferences文件的名稱,如果指定的文件不存在則會創建一個,文件的路徑在:“/data/data/應用程序包名/shared_prefs/”目錄下; 第二個參數用於指定文件讀寫的操作模式。   主要有以下幾種模式可以選擇:【文件讀寫的操作模式】  
  • Context.MODE_PRIVATE:是默認的操作模式,表示該SharedPreferences文件的數據只能被當前的應用程序讀寫。當指定同樣文件名的時候,新寫入的內容會覆蓋原文件中的內容;
  • Context.MODE_APPEND:表示如果該文件已存在,不會創建新文件,而是往原文件裡追加內容;
  • Context.MODE_MULTI_PROCESS:用於會有多個進程對同一個SharedPreferences文件進行讀寫;
  • Context.MODE_WORLD_READABLE:指定 SharedPreferences數據能被其他應用程序讀,但是不支持寫。該模式已在Android4.2版本中廢棄;
  • Context.MODE_WORLD_WRITEABLE: 指定 SharedPreferences數據能被其他應用程序讀、寫。會覆蓋原數據。該模式已在Android4.2版本中廢棄。
  • 可以使用 + 連接這些權限。
    2、通過Activity類的getPreferences( int mode)方法來獲取: 這個方法和Context的getSharedPreferences(String name, int mode)方法很相似,不過該方法只有一個操作模式參數。該方法會自動將當前Activity的類名作為SharedPreferences的文件名。   3、通過PreferenceManager類的getDefaultSharedPreferences( Context context)方法來獲取: 這是一個靜態方法,它接收一個Context參數。該方法會將當前應用程序的包名作為前綴來為SharedPreferences文件自動命名。例如包名為“org.mobiletrain.preferenceactivity” 的應用,會在“/data/data/org.mobiletrain.preferenceactivity/shared_prefs/”目錄下創建SharedPreferences文件,文件名為org.mobiletrain.preferenceactivity_preferences.xml。   【備注:】 Android設備上的app都有一個放置在沙盒中的文件目錄。將文件保存在沙盒中可以阻止其他APP訪問。 每個APP的沙盒目錄都是/data/data/包名   沙盒也叫沙箱,英文sandbox。在計算機領域指一種虛擬技術,且多用於計算機安全技術。其原理是通過重定向技術,把程序生成和修改的文件定向到自身文件夾中。當某個程序試圖發揮作用時,安全軟件可以先讓它在沙盒中運行,如果含有惡意行為,則禁止程序的進一步運行,而這不會對系統造成任何危害。     (四)、核心代碼:
button_main_savedata.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                                prefs = getSharedPreferences("myaccount", Context.MODE_PRIVATE);
                                SharedPreferences.Editor editor = prefs.edit();
                                editor.putInt("age", 38);
                                editor.putString("username", "wangxiangjun");
                                editor.putString("pwd", "123456");
                                editor.putString("username", "xiangjun");
                                editor.putString("age", "I'm 40 years old!");
                                editor.commit();
                        }
                });

                button_main_readdata.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                                prefs = getSharedPreferences("myaccount", Context.MODE_PRIVATE);
                                String name = prefs.getString("username", "wxj");
                                String pwd = prefs.getString("pwd", "000");
                                int age = prefs.getInt("age", 20);
                                System.out.println("====>" + name + ":" + pwd + ":" + age);
                        }
                });
    (四)、保存之後的SharedPreferences數據文件: SharedPreferences數據總是以xml格式保存在:/data/data/包名/shared_prefs目錄下; 例如: 123456 xiangjun 20       (五)、SharedPreferences的設置Settings功能: 1、引入: \   手機中常有這樣的設置頁面,如果做這樣的頁面呢?是不是需要寫一個復雜的布局文件,再寫一堆事件監聽來完成呢?   2、PreferenceActivity的簡單用法: 1)、步驟:
  • 將setting.xml文件放到res的xml目錄下;
  • 將arrays.xml文件放到values目錄下;
  • 寫一個頁面SettingActivity。 2)、目錄結構: \   3)、核心代碼:
    //在SettingActivity中。不再需要setContentView(R.layout.activity_main)方法來加載布局了。
    protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                // setContentView(R.layout.activity_main);
                addPreferencesFromResource(R.xml.setting);  
                //備注:This method was deprecated in API level 11. This function is not relevant for a modern fragment-based PreferenceActivity.這個方法在11版本以上就已經不推薦使用了。
        }
    (六)、借助SharedPreferences實現黑名單管理:   1、示例代碼:
publicclass MainActivity extends Activity {
private ListView listView_main_blockList;
private EditText editText_main_number;
private TextView textView_main_emptyinfo;
private SharedPreferences prefs = null;
private Editor editor = null;
private ArrayAdapter adapter = null;


        @Override
protectedvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);


           editText_main_number = (EditText) findViewById(R.id.editText_main_number);
           listView_main_blockList = (ListView) findViewById(R.id.listView_main_blocklist);


           textView_main_emptyinfo = (TextView) findViewById(R.id.text_main_emptyinfo);


prefs = getSharedPreferences("blocklist", Context.MODE_PRIVATE);
editor = prefs.edit();


         List list = getBlocklist();


adapter = new ArrayAdapter(this,
                                 android.R.layout.simple_list_item_1, list);
// 注意setEmptyView()的用法。當適配器為空的時候,設置ListView中的展示內容。
listView_main_blockList.setEmptyView(textView_main_emptyinfo);
listView_main_blockList.setAdapter(adapter);


 }


publicvoid clickButton(View view) {
switch (view.getId()) {
case R.id.button_main_add:
                 String mpnumber = editText_main_number.getText().toString();
editor.putString(mpnumber, mpnumber);
editor.commit();
                 fillListView();
break;
case R.id.button_main_clear:
editor.clear();
editor.commit();
                 fillListView();
break;
default:
break;
         }
 }


 /*
        * 獲取SharedPreferences中的全部數據,放到List集合中。形成適配器的數據源
        */
private List getBlocklist() {
         List list = new ArrayList();
try {
                 Map map = prefs.getAll();
                 // 增強for循環,實現對Map集合的遍歷
for (Map.Entry entry : map.entrySet()) {
                         list.add(entry.getKey());
                 }
return list;
         } catch (Exception e) {
returnnull;
         }
 }


 /*
        * 填充ListView控件,實現刷新顯示數據的效果
        */
privatevoid fillListView() {
adapter.clear();
adapter.addAll(getBlocklist());
 }


        @Override
publicboolean onCreateOptionsMenu(Menu menu) {
         getMenuInflater().inflate(R.menu.main, menu);
returntrue;
 }


}
    三、內部存儲: (一)、Context類提供的基本文件和目錄處理方法 1、getCacheDir() 獲取內部存儲緩存目錄 /data/data/包名/cache。備注:應及時清理該目錄,並節約使用空間   2、getFilesDir() 獲取內部存儲文件目錄 /data/data/包名/files   跟SharedPreferences目錄的區別:/data/data/包名/shared_prefs   3、String[] fileList() 獲取內部存儲/data/data/包名/files 目錄下的文件列表   4、openFileInput(String name) 打開內部存儲的files目錄下的文件   5、openFileOutput(String name , int mode) 打開內存存儲空間上文件進行寫入,如果不存在則創建該文件       四、External Storage之SDCard操作: (一)、引入:Android中提供了特有的兩個方法來進行IO操作(openFileInput()和openFileOutput() ),但是畢竟手機內置存儲空間很有限,為了更好地存儲應用程序的大文件數據,需要讀寫SD卡上的文件。SD卡大大擴充了手機的存儲能力。   (二)、讀寫SD卡的步驟: 1、先判斷手機是否有sd卡; 調用Environment的getExternalStorageState()方法判斷手機是否插上sdcard。 2、獲取sdcard的路徑; 調用Environment的getExternalStorageDirectory()方法來獲取外部存儲器的目錄。 3、此外還可以獲取SDCard可用磁盤空間的大小(借助StatFs類來實現); 4、清單文件中設置讀寫sdcard的權限; 在sdcard中創建與刪除文件的權限 向sdcard讀取權限 向sdcard寫入權限 5、執行讀寫操作(基本IO流操作)。   【備注:】 Environment.getExternalStorageDirectory().getPath()來獲取sdcard路徑,如果您需要往sdcard中保存特定類型的內容,可以考慮使用Environment.getExternalStoragePublicDirectory(String type)方法,該方法可以返回特定類型的目錄,目前支持如下類型:
  1. DIRECTORY_ALARMS//警報的鈴聲
  2. DIRECTORY_DCIM//相機拍攝的圖片和視頻保存的位置
  3. DIRECTORY_DOWNLOADS//下載文件保存的位置
  4. DIRECTORY_MOVIES//電影保存的位置, 比如 通過google play下載的電影
  5. DIRECTORY_MUSIC//音樂保存的位置
  6. DIRECTORY_NOTIFICATIONS//通知音保存的位置
  7. DIRECTORY_PICTURES//下載的圖片保存的位置
  8. DIRECTORY_PODCASTS//用於保存podcast(博客)的音頻文件
  9. DIRECTORY_RINGTONES//保存鈴聲的位置  
【備注:】 應用程序在運行的過程中如果需要向手機上保存數據,一般是把數據保存在SDcard中的。大部分應用是直接在SDCard的根目錄下創建一個文件夾,然後把數據保存在該文件夾中。這樣當該應用被卸載後,這些數據還保留在SDCard中,留下了垃圾數據。如果你想讓你的應用被卸載後,與該應用相關的數據也清除掉,該怎麼辦呢?    
  • 通過Context.getExternalFilesDir()方法可以獲取到 SDCard/Android/data/應用的包名/files/ 目錄,一般放一些長時間保存的數據 【設置->應用->應用詳情裡面的”清除數據 Clear Data“】
  • 通過Context.getExternalCacheDir()方法可以獲取到 SDCard/Android/data/應用包名/cache/目錄,一般存放臨時緩存數據 【設置->應用->應用詳情裡面的”清除緩存“ Clear Cache】
  • 如果使用上面的方法,當你的應用在被用戶卸載後,SDCard/Android/data/你的應用的包名/ 這個目錄下的所有文件都會被刪除,不會留下垃圾信息。
  而且上面二個目錄分別對應 設置->應用->應用詳情裡面的”清除數據“與”清除緩存“選項。當然如果要保存下載的內容,就不要放在以上目錄下。     (三)、SDCard私有文件目錄: 1、私有目錄的files目錄下有分為以下7種(無DIRECTORY_DCIM和DIRECTORY_DOWNLOADS):
  • DIRECTORY_ALARMS
  • DIRECTORY_MOVIES
  • DIRECTORY_MUSIC
  • DIRECTORY_NOTIFICATIONS
  • DIRECTORY_PICTURES
  • DIRECTORY_PODCASTS
  • DIRECTORY_RINGTONES
  2、私有目錄的cache目錄:       (三)、封裝SDCard的工具類:SDCardHelper類
package com.steven.sdcardhelper;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

import android.content.Context;
import android.os.Environment;
import android.os.StatFs;

public class SDCardHelper {

	// 判斷SD卡是否被掛載
	public static boolean isSDCardMounted() {
		// return Environment.getExternalStorageState().equals("mounted");
		return Environment.getExternalStorageState().equals(
				Environment.MEDIA_MOUNTED);
	}

	// 獲取SD卡的根目錄
	public static String getSDCardBaseDir() {
		if (isSDCardMounted()) {
			return Environment.getExternalStorageDirectory().getAbsolutePath();
		}
		return null;
	}

	// 獲取SD卡的完整空間大小,返回MB
	public static long getSDCardSize() {
		if (isSDCardMounted()) {
			StatFs fs = new StatFs(getSDCardBaseDir());
			int count = fs.getBlockCount();
			int size = fs.getBlockSize();
			return count * size / 1024 / 1024;
		}
		return 0;
	}

	// 獲取SD卡的剩余空間大小
	public static long getSDCardFreeSize() {
		if (isSDCardMounted()) {
			StatFs fs = new StatFs(getSDCardBaseDir());
			int count = fs.getFreeBlocks();
			int size = fs.getBlockSize();
			return count * size / 1024 / 1024;
		}
		return 0;
	}

	// 獲取SD卡的可用空間大小
	public static long getSDCardAvailableSize() {
		if (isSDCardMounted()) {
			StatFs fs = new StatFs(getSDCardBaseDir());
			int count = fs.getAvailableBlocks();
			int size = fs.getBlockSize();
			return count * size / 1024 / 1024;
		}
		return 0;
	}

	// 往SD卡的公有目錄下保存文件
	public static boolean saveFileToSDCardPublicDir(byte[] data, String type,
			String fileName) {
		BufferedOutputStream bos = null;
		if (isSDCardMounted()) {
			File file = Environment.getExternalStoragePublicDirectory(type);
			try {
				bos = new BufferedOutputStream(new FileOutputStream(new File(
						file, fileName)));
				bos.write(data);
				bos.flush();
				return true;
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				try {
					bos.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
		return false;
	}

	// 往SD卡的自定義目錄下保存文件
	public static boolean saveFileToSDCardCustomDir(byte[] data, String dir,
			String fileName) {
		BufferedOutputStream bos = null;
		if (isSDCardMounted()) {
			File file = new File(getSDCardBaseDir() + File.separator + dir);
			if (!file.exists()) {
				file.mkdirs();// 遞歸創建自定義目錄
			}
			try {
				bos = new BufferedOutputStream(new FileOutputStream(new File(
						file, fileName)));
				bos.write(data);
				bos.flush();
				return true;
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				try {
					bos.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
		return false;
	}

	// 往SD卡的私有Files目錄下保存文件
	public static boolean saveFileToSDCardPrivateFilesDir(byte[] data,
			String type, String fileName, Context context) {
		BufferedOutputStream bos = null;
		if (isSDCardMounted()) {
			File file = context.getExternalFilesDir(type);
			try {
				bos = new BufferedOutputStream(new FileOutputStream(new File(
						file, fileName)));
				bos.write(data);
				bos.flush();
				return true;
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				try {
					bos.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
		return false;
	}

	// 往SD卡的私有Cache目錄下保存文件
	public static boolean saveFileToSDCardPrivateCacheDir(byte[] data,
			String fileName, Context context) {
		BufferedOutputStream bos = null;
		if (isSDCardMounted()) {
			File file = context.getExternalCacheDir();
			try {
				bos = new BufferedOutputStream(new FileOutputStream(new File(
						file, fileName)));
				bos.write(data);
				bos.flush();
				return true;
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				try {
					bos.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
		return false;
	}

	// 從SD卡獲取文件
	public static byte[] loadFileFromSDCard(String fileDir) {
		BufferedInputStream bis = null;
		ByteArrayOutputStream baos = new ByteArrayOutputStream();

		try {
			bis = new BufferedInputStream(
					new FileInputStream(new File(fileDir)));
			byte[] buffer = new byte[8 * 1024];
			int c = 0;
			while ((c = bis.read(buffer)) != -1) {
				baos.write(buffer, 0, c);
				baos.flush();
			}
			return baos.toByteArray();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				baos.close();
				bis.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return null;
	}

	// 獲取SD卡公有目錄的路徑
	public static String getSDCardPublicDir(String type) {
		return Environment.getExternalStoragePublicDirectory(type).toString();
	}

	// 獲取SD卡私有Cache目錄的路徑
	public static String getSDCardPrivateCacheDir(Context context) {
		return context.getExternalCacheDir().getAbsolutePath();
	}

	// 獲取SD卡私有Files目錄的路徑
	public static String getSDCardPrivateFilesDir(Context context, String type) {
		return context.getExternalFilesDir(type).getAbsolutePath();
	}
}

(四)、案例:
1、功能:點擊按鈕,實現從網絡上訪問圖片,將圖片保存進SDCard中。點擊另外一按鈕,可以獲取到剛才保存進SDCard中的圖片,將其加載的頁面中的ImageView控件中。
2、示例代碼:、示例代碼:
publicclass MainActivity extends Activity {

private ImageView imageView_main_img;

private String urlString = "http://t2.baidu.com/it/u=2,1891512358&fm=19&gp=0.jpg";




     @Override

protectedvoid onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

           setContentView(R.layout.activity_main);

imageView_main_img = (ImageView) findViewById(R.id.imageView_main_img);

   }




publicvoid clickButton(View view) {

switch (view.getId()) {

case R.id.button_main_save:

new MyTask(this).execute(urlString);

break;

case R.id.button_main_show:

                   String filepath = SDCardHelper.getSDCardPath() + File.separator

                                       + "mydir" + File.separator + "firstimg.jpg";

byte[] data = SDCardHelper.loadFileFromSDCard(filepath);

if (data != null) {

                           Bitmap bm = BitmapFactory.decodeByteArray(data, 0, data.length);

imageView_main_img.setImageBitmap(bm);

                   } else {

                           Toast.makeText(this, "沒有該圖片!", Toast.LENGTH_LONG).show();

                   }

break;

default:

break;

           }

   }




class MyTask extends AsyncTask {

private Context context;

private ProgressDialog pDialog;




public MyTask(Context context) {

this.context = context;

pDialog = new ProgressDialog(context);

pDialog.setIcon(R.drawable.ic_launcher);

pDialog.setMessage("圖片加載中...");

           }




             @Override

protectedvoid onPreExecute() {

super.onPreExecute();

pDialog.show();

           }




             @Override

protectedbyte[] doInBackground(String... params) {

                   BufferedInputStream bis = null;

                   ByteArrayOutputStream baos = new ByteArrayOutputStream();

try {

                           URL url = new URL(params[0]);

                           HttpURLConnection httpConn = (HttpURLConnection) url

                                           .openConnection();

                           httpConn.setDoInput(true);

                           httpConn.connect();




if (httpConn.getResponseCode() == 200) {

                                   bis = new BufferedInputStream(httpConn.getInputStream());

byte[] buffer = newbyte[1024 * 8];

int c = 0;




while ((c = bis.read(buffer)) != -1) {

                                           baos.write(buffer, 0, c);

                                           baos.flush();

                                   }

return baos.toByteArray();

                           }




                   } catch (Exception e) {

                           e.printStackTrace();

                   }

returnnull;

           }




             @Override

protectedvoid onPostExecute(byte[] result) {

super.onPostExecute(result);

if (result == null) {

                           Toast.makeText(context, "圖片加載失敗!", Toast.LENGTH_LONG).show();

                   } else {

                              // 將字節數組轉成Bitmap,然後將bitmap加載的imageview控件中

                              // Bitmap bitmap = BitmapFactory.decodeByteArray(result, 0,

                              // result.length);

                              // imageView_main_img.setImageBitmap(bitmap);

if (SDCardHelper.saveFileToSDCard(result, "mydir",

                                               "firstimg.jpg")) {

                                   Toast.makeText(context, "圖片保存OK!", Toast.LENGTH_LONG)

                                                   .show();

                           } else {

                                   Toast.makeText(context, "圖片保存失敗!", Toast.LENGTH_LONG)

                                                   .show();

                           }

                   }

pDialog.dismiss();

           }

   }




     @Override

publicboolean onCreateOptionsMenu(Menu menu) {

           getMenuInflater().inflate(R.menu.main, menu);

returntrue;

   }

}
    (五)、案例:SDCard文件浏覽器   1、效果如圖: \   2、原理:利用File對象的listFile()方法獲得File[]數組。將數組產生的信息填充在listview中。 核心代碼中的重要方法:
  1. listFiles()
  2. isFile()
  3. isDirectory()
  4. getAbsolutePath()
  5. getParentFile()
  6.  
3、核心示例代碼:
publicclass MainActivity extends Activity {
private TextView textView_main_currentpath;
private ListView listView_main_fileList;


private File currentFile = null;
private File[] arrCurrentFiles = null;


     @Override
protectedvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);


                textView_main_currentpath = (TextView) findViewById(R.id.text_main_currentpath);
                listView_main_fileList = (ListView) findViewById(R.id.listView_main_filelist);


if (SDCardHelper.isSDCardMounted()) {
currentFile = new File(SDCardHelper.getSDCardPath());
                      fillListView(currentFile);
              } else {
                      Toast.makeText(MainActivity.this, "SDCARD不存在!", Toast.LENGTH_LONG)
                                      .show();
              }


                listView_main_fileList
                              .setOnItemClickListener(new OnItemClickListener() {


                                     @Override
publicvoid onItemClick(AdapterView parent, View view,
int position, long id) {
if (arrCurrentFiles[position].isDirectory()) {
                                                      File[] arrSubFiles = arrCurrentFiles[position]
                                                                      .listFiles();
if (arrSubFiles.length == 0) {
                                                              Toast.makeText(MainActivity.this, "您點擊的是空目錄!",
                                                                              2000).show();
                                                      } else {
                                                              fillListView(arrCurrentFiles[position]);
                                                      }


                                              } else {
                                                      Toast.makeText(MainActivity.this, "您點擊的不是目錄!",
                                                                      Toast.LENGTH_LONG).show();
                                              }
                                      }
                              });


      }


publicvoid clickButton(View view) {
switch (view.getId()) {
case R.id.imageView_main_back:
if (!currentFile.getAbsolutePath().equals(
                                      SDCardHelper.getSDCardPath())) {
                              fillListView(currentFile.getParentFile());
                      }
break;
default:
break;
              }
      }


publicvoid fillListView(File file) {
                currentFile = file;
                arrCurrentFiles = currentFile.listFiles();


              List> list = new ArrayList>();
for (int i = 0; i < arrCurrentFiles.length; i++) {
                      Map map = new HashMap();
if (arrCurrentFiles[i].isDirectory()) {
                              map.put("imgId", R.drawable.folder);
                      } else {
                              map.put("imgId", R.drawable.file);
                      }
                      map.put("filename", arrCurrentFiles[i].getName());
                      list.add(map);
              }


              SimpleAdapter adapter = new SimpleAdapter(MainActivity.this, list,
                           R.layout.item_listview_main,
new String[] { "imgId", "filename" }, newint[] {
                                           R.id.imageView_item_listview_type,
                                           R.id.text_item_listview_filename });
listView_main_fileList.setAdapter(adapter);
                textView_main_currentpath.setText(currentFile.getAbsolutePath());
      }


}
    (六)、案例:SDCard圖片浏覽器
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved