Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android入門:彈出框選擇文件夾目錄 以及啟用新的Task打開文件

Android入門:彈出框選擇文件夾目錄 以及啟用新的Task打開文件

編輯:Android開發實例

最近想寫一個選擇照片文件夾的功能,就寫了個選擇文件夾功能的demo,主要就是選擇目標目錄,順便看了下文件打開的方式

 

首先看效果圖

 

 

第一個Activity很簡單就是一個按鈕Button 加一個 TextView

 

見main.xml

 

 

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <LinearLayout   
  3.   xmlns:android="http://schemas.android.com/apk/res/android" 
  4.   android:layout_width="fill_parent" 
  5.   android:layout_height="fill_parent" 
  6.   android:orientation="vertical" 
  7.   android:background="@drawable/white" 
  8. <Button       
  9.     android:id="@+id/button"    
  10.     android:layout_width="fill_parent"      
  11.     android:layout_height="wrap_content"      
  12.     android:text="選擇文件"    
  13.     /> 
  14. <TextView 
  15.     android:id="@+id/fileText" 
  16.     android:gravity="center" 
  17.     android:textSize="20px" 
  18.     android:textColor="#219ac6" 
  19.     android:layout_width="fill_parent"      
  20.     android:layout_height="fill_parent"      
  21.     /> 
  22. </LinearLayout> 

 

Button彈出顯示文件夾選擇框

TextView就是用來顯示當前選擇的文件夾路徑

 

 

  1. public class MainAcivity extends Activity{  
  2.       
  3.     public static final int FILE_RESULT_CODE = 1;  
  4.       
  5.     private TextView textView;  
  6.       
  7.     @Override 
  8.     protected void onCreate(Bundle savedInstanceState) {  
  9.         super.onCreate(savedInstanceState);  
  10.         setContentView(R.layout.main);  
  11.         Button button = (Button)findViewById(R.id.button);  
  12.         textView = (TextView)findViewById(R.id.fileText);  
  13.         button.setOnClickListener(new OnClickListener() {  
  14.               
  15.             public void onClick(View v) {  
  16.                 Intent intent = new Intent(MainAcivity.this,MyFileManager.class);  
  17.                 startActivityForResult(intent, FILE_RESULT_CODE);  
  18.             }  
  19.         });  
  20.     }  
  21.       
  22.     @Override 
  23.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  24.         if(FILE_RESULT_CODE == requestCode){  
  25.             Bundle bundle = null;  
  26.             if(data!=null&&(bundle=data.getExtras())!=null){  
  27.                 textView.setText("選擇文件夾為:"+bundle.getString("file"));  
  28.             }  
  29.         }  
  30.     }  

 

 

這裡通過startActivityForResult()彈出的Activity  所以要重寫onActivityResult方法

 

在目標Activity調用方法finish()的時候會回調

 

這裡需要注意在按返回鍵時也會調用該方法 所以這裡還需要判空

 

然後再 MyFileManager 這個Activity中通過ListView來顯示文件列表

 

布局文件 fileselect.xml

 

 

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <LinearLayout   
  3.   xmlns:android="http://schemas.android.com/apk/res/android" 
  4.   android:layout_width="250px" 
  5.   android:layout_height="400px" 
  6.   android:orientation="vertical" 
  7.   android:background="@drawable/white" 
  8.   <TextView   
  9.     android:id="@+id/mPath" 
  10.     android:layout_width="wrap_content" 
  11.     android:layout_height="wrap_content" 
  12.     android:padding="5px" 
  13.     android:textSize="18sp" 
  14.     android:textColor="@drawable/blue" 
  15.   > 
  16.   </TextView> 
  17.   <ListView   
  18.     android:id="@android:id/list" 
  19.     android:layout_width="fill_parent" 
  20.     android:layout_height="330px" 
  21.   > 
  22.   </ListView> 
  23.   <LinearLayout   
  24.     android:gravity="center" 
  25.     android:layout_width="wrap_content" 
  26.     android:layout_height="wrap_content" 
  27.     android:orientation="horizontal" 
  28.     android:background="@drawable/white" 
  29.     > 
  30.     <Button       
  31.     android:id="@+id/buttonConfirm"    
  32.     android:layout_width="125px"      
  33.     android:layout_height="fill_parent"      
  34.     android:text="確定"    
  35.     /> 
  36.     <Button       
  37.     android:id="@+id/buttonCancle"    
  38.     android:layout_width="125px"      
  39.     android:layout_height="fill_parent"      
  40.     android:text="取消"    
  41.     /> 
  42.       
  43.   </LinearLayout> 
  44. </LinearLayout> 

 

列表顯示Item 通過布局文件 file_row.xml

 

 

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <LinearLayout 
  3.   xmlns:android="http://schemas.android.com/apk/res/android" 
  4.   android:orientation="horizontal" 
  5.   android:layout_width="fill_parent" 
  6.   android:layout_height="fill_parent" 
  7.   android:background="#ffffff"      
  8. <LinearLayout    
  9.         android:orientation="horizontal"    
  10.         android:layout_width="fill_parent"    
  11.         android:layout_height="fill_parent"    
  12.         android:background="@drawable/listview_selected"    
  13.         android:padding="6px"    
  14.     >    
  15.   <ImageView android:id="@+id/icon" 
  16.     android:layout_width="30dip" 
  17.     android:layout_height="30dip" 
  18.   > 
  19.   </ImageView> 
  20.   <TextView android:id="@+id/text" 
  21.     android:layout_gravity="center_horizontal" 
  22.     android:layout_width="fill_parent" 
  23.     android:layout_height="wrap_content"   
  24.     android:textColor="@drawable/black" 
  25.   > 
  26.   </TextView> 
  27.   </LinearLayout> 
  28. </LinearLayout> 

 

這裡簡單實現點擊變換底色的效果 通過兩層LinearLayout 的方式實現 創建一個select可以自定義點擊效果 就不贅述了

 

文件選擇代碼

 

  1. package com.debby;  
  2. import java.io.File;  
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5. import android.app.ListActivity;  
  6. import android.content.Intent;  
  7. import android.net.Uri;  
  8. import android.os.Bundle;  
  9. import android.util.Log;  
  10. import android.view.View;  
  11. import android.view.View.OnClickListener;  
  12. import android.view.Window;  
  13. import android.widget.Button;  
  14. import android.widget.ListView;  
  15. import android.widget.TextView;  
  16. public class MyFileManager extends ListActivity {  
  17.     private List<String> items = null;  
  18.     private List<String> paths = null;  
  19.     private String rootPath = "/";  
  20.     private String curPath = "/";  
  21.     private TextView mPath;  
  22.     private final static String TAG = "bb";  
  23.     @Override 
  24.     protected void onCreate(Bundle icicle) {  
  25.         super.onCreate(icicle);  
  26.         requestWindowFeature(Window.FEATURE_NO_TITLE);  
  27.         setContentView(R.layout.fileselect);  
  28.         mPath = (TextView) findViewById(R.id.mPath);  
  29.         Button buttonConfirm = (Button) findViewById(R.id.buttonConfirm);  
  30.         buttonConfirm.setOnClickListener(new OnClickListener() {  
  31.             public void onClick(View v) {  
  32.                 Intent data = new Intent(MyFileManager.this, MainAcivity.class);  
  33.                 Bundle bundle = new Bundle();  
  34.                 bundle.putString("file", curPath);  
  35.                 data.putExtras(bundle);  
  36.                 setResult(2, data);  
  37.                 finish();  
  38.             }  
  39.         });  
  40.         Button buttonCancle = (Button) findViewById(R.id.buttonCancle);  
  41.         buttonCancle.setOnClickListener(new OnClickListener() {  
  42.             public void onClick(View v) {  
  43.                 finish();  
  44.             }  
  45.         });  
  46.         getFileDir(rootPath);  
  47.     }  
  48.     private void getFileDir(String filePath) {  
  49.         mPath.setText(filePath);  
  50.         items = new ArrayList<String>();  
  51.         paths = new ArrayList<String>();  
  52.         File f = new File(filePath);  
  53.         File[] files = f.listFiles();  
  54.         if (!filePath.equals(rootPath)) {  
  55.             items.add("b1");  
  56.             paths.add(rootPath);  
  57.             items.add("b2");  
  58.             paths.add(f.getParent());  
  59.         }  
  60.         for (int i = 0; i < files.length; i++) {  
  61.             File file = files[i];  
  62.             items.add(file.getName());  
  63.             paths.add(file.getPath());  
  64.         }  
  65.         setListAdapter(new MyAdapter(this, items, paths));  
  66.     }  
  67.     @Override 
  68.     protected void onListItemClick(ListView l, View v, int position, long id) {  
  69.         File file = new File(paths.get(position));  
  70.         if (file.isDirectory()) {  
  71.             curPath = paths.get(position);  
  72.             getFileDir(paths.get(position));  
  73.         } else {  
  74.             //可以打開文件  
  75.         }  
  76.     }  

 

 

  1. import java.io.File;  
  2. import java.util.List;  
  3. import com.debby.R;  
  4. import android.content.Context;  
  5. import android.graphics.Bitmap;  
  6. import android.graphics.BitmapFactory;  
  7. import android.view.LayoutInflater;  
  8. import android.view.View;  
  9. import android.view.ViewGroup;  
  10. import android.widget.BaseAdapter;  
  11. import android.widget.ImageView;  
  12. import android.widget.TextView;  
  13. public class MyAdapter extends BaseAdapter  
  14. {  
  15.   private LayoutInflater mInflater;  
  16.   private Bitmap mIcon1;  
  17.   private Bitmap mIcon2;  
  18.   private Bitmap mIcon3;  
  19.   private Bitmap mIcon4;  
  20.   private List<String> items;  
  21.   private List<String> paths;  
  22.   public MyAdapter(Context context,List<String> it,List<String> pa)  
  23.   {  
  24.     mInflater = LayoutInflater.from(context);  
  25.     items = it;  
  26.     paths = pa;  
  27.     mIcon1 = BitmapFactory.decodeResource(context.getResources(),R.drawable.back01);  
  28.     mIcon2 = BitmapFactory.decodeResource(context.getResources(),R.drawable.back02);  
  29.     mIcon3 = BitmapFactory.decodeResource(context.getResources(),R.drawable.folder);  
  30.     mIcon4 = BitmapFactory.decodeResource(context.getResources(),R.drawable.doc);  
  31.   }  
  32.     
  33.   @Override 
  34.   public int getCount()  
  35.   {  
  36.     return items.size();  
  37.   }  
  38.   @Override 
  39.   public Object getItem(int position)  
  40.   {  
  41.     return items.get(position);  
  42.   }  
  43.     
  44.   @Override 
  45.   public long getItemId(int position)  
  46.   {  
  47.     return position;  
  48.   }  
  49.     
  50.   @Override 
  51.   public View getView(int position,View convertView,ViewGroup parent)  
  52.   {  
  53.     ViewHolder holder;  
  54.       
  55.     if(convertView == null)  
  56.     {  
  57.       convertView = mInflater.inflate(R.layout.file_row, null);  
  58.       holder = new ViewHolder();  
  59.       holder.text = (TextView) convertView.findViewById(R.id.text);  
  60.       holder.icon = (ImageView) convertView.findViewById(R.id.icon);  
  61.         
  62.       convertView.setTag(holder);  
  63.     }  
  64.     else 
  65.     {  
  66.       holder = (ViewHolder) convertView.getTag();  
  67.     }  
  68.     File f=new File(paths.get(position).toString());  
  69.     if(items.get(position).toString().equals("b1"))  
  70.     {  
  71.       holder.text.setText("返回根目錄..");  
  72.       holder.icon.setImageBitmap(mIcon1);  
  73.     }  
  74.     else if(items.get(position).toString().equals("b2"))  
  75.     {  
  76.       holder.text.setText("返回上一層..");  
  77.       holder.icon.setImageBitmap(mIcon2);  
  78.     }  
  79.     else 
  80.     {  
  81.       holder.text.setText(f.getName());  
  82.       if(f.isDirectory())  
  83.       {  
  84.         holder.icon.setImageBitmap(mIcon3);  
  85.       }  
  86.       else 
  87.       {  
  88.         holder.icon.setImageBitmap(mIcon4);  
  89.       }  
  90.     }  
  91.     return convertView;  
  92.   }  
  93.   private class ViewHolder  
  94.   {  
  95.     TextView text;  
  96.     ImageView icon;  
  97.   }  

 

 

 

在 onListItemClick 事件中改變ListView的Adapter實現打開文件夾

 

這裡點擊文件夾時可以打開目錄,如果選擇文件可以根據類型來啟用不同工具來打開

 

方法如下

 

  1. private void openFile(File f) {  
  2.         Intent intent = new Intent();  
  3.         intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
  4.         intent.setAction(android.content.Intent.ACTION_VIEW);  
  5.         String type = getMIMEType(f);  
  6.         intent.setDataAndType(Uri.fromFile(f), type);  
  7.         startActivity(intent);  
  8.     }  
  9.     private String getMIMEType(File f) {  
  10.         String type = "";  
  11.         String fName = f.getName();  
  12.         String end = fName  
  13.                 .substring(fName.lastIndexOf(".") + 1, fName.length())  
  14.                 .toLowerCase();  
  15.         if (end.equals("m4a") || end.equals("mp3") || end.equals("mid")  
  16.                 || end.equals("xmf") || end.equals("ogg") || end.equals("wav")) {  
  17.             type = "audio";  
  18.         } else if (end.equals("3gp") || end.equals("mp4")) {  
  19.             type = "video";  
  20.         } else if (end.equals("jpg") || end.equals("gif") || end.equals("png")  
  21.                 || end.equals("jpeg") || end.equals("bmp")) {  
  22.             type = "image";  
  23.         } else {  
  24.             type = "*";  
  25.         }  
  26.         type += "/*";  
  27.         return type;  
  28.     } 

 

根據文件的後綴名來確定type 然後打開文件,打開方式通過setDataAndType方法設置

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved