Android 응용 프로그램 에서 로 컬 파일 과 디 렉 터 리 를 선택 한 실례 공 유 를 실현 합 니 다

17249 단어 Android문건목차
파일 선택 기
오늘 은 파일 선택 기의 역할 을 공유 합 니 다.구체 적 으로 는 사용자 가 SD 카드 에서 선택 한 파일/폴 더 경 로 를 가 져 오 는 것 입 니 다.C\#에서 OpenFileDialog 컨트롤 과 유사 합 니 다.기능 이 실현 되 기 가 비교적 간단 한데,주로 모두 가 개발 시간 을 절약 하도록 돕 는 것 이다.
인터넷 에 널리 퍼 진 완제품 은 다음 과 같다.그 밖 에 주요 특징 은 다음 과 같다.
1.사용자 가 Back 키 를 누 른 이 벤트 를 감청 하여 이전 디 렉 터 리 로 되 돌려 줍 니 다.
2.서로 다른 파일 형식(파일 vs 폴 더,대상 파일 vs 다른 파일)에 대해 특수 처 리 를 했 습 니 다.
지식 포인트 1.File 류 의 사용
파일 선택 기의 주요 기능 은 파일\폴 더,파일 형식 등 을 탐색 하 는 것 입 니 다.모두 자바 File 클래스 를 통 해 이 루어 집 니 다.
지식 점 2.호출 방법 설명  
startActivity ForResult()호출 및 onActivity Result()방법 으로 리 셋 된 정 보 를 받 았 습 니 다.
캡 처 는 다음 과 같 습 니 다.
2016229165242531.jpg (480×800)
다른 것 도 할 말 이 없 으 니 코드 주석 을 보 세 요~~  so easy  - - 。
FileChooser Activity.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(); 
    } 
  } 
} 

화면 이 여전히 추 합 니 다.여러분 은 수요 에 따라 이 를 바탕 으로 기능 을 추가 할 수 있 습 니 다.아래 에서 디 렉 터 리 를 선택 하 는 것 도 대체적으로 같 습 니 다.
디 렉 터 리 선택 기
2016229165344603.png (480×800)
2016229165404231.png (480×800)
2016229165421449.png (480×800)
2016229165435853.png (480×800)
chooserdialog.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" 
  > 
 
  <LinearLayout 
    android:orientation="horizontal" 
    android:layout_width="fill_parent" 
    android:layout_height="40dip"> 
  <Button  
    android:layout_width="40dip"  
    android:layout_height="40dip" 
    android:text="HOME" 
    android:id="@+id/btn_home"  
    android:layout_gravity="left" 
    android:layout_weight="1" 
  /> 
  <LinearLayout android:layout_width="140dip"  
    android:layout_height="35dip"  
    android:id="@+id/dir_layout" 
    android:gravity="center" 
    android:layout_weight="1"> 
    </LinearLayout> 
  <!-- <TextView  
    android:layout_width="140dip"  
    android:layout_height="35dip"  
    android:id="@+id/dir_str" 
    android:gravity="center" 
    android:layout_weight="1" 
  /> --> 
  <Button  
    android:layout_width="40dip"  
    android:layout_height="40dip" 
    android:text="BACK" 
    android:id="@+id/btn_back"  
    android:layout_gravity="right" 
    android:layout_weight="1" 
  /> 
  </LinearLayout> 
  <ListView  
    android:layout_width="fill_parent" 
    android:layout_height="300dip" 
    android:id="@+id/list_dir" 
  /> 
  <Button  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:id="@+id/btn_ok" 
    android:text="OK"/> 
</LinearLayout> 


package hkp.dirchooser;
import java.io.File; 
import java.util.ArrayList; 
import java.util.List; 
 
import android.app.Dialog; 
import android.content.Context; 
import android.os.Bundle; 
import android.os.Environment; 
import android.os.Handler; 
import android.view.Gravity; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.LinearLayout; 
import android.widget.ListView; 
import android.widget.TextView; 
import android.widget.Toast; 
 

public class DirChooserDialog extends Dialog implements android.view.View.OnClickListener{ 
   
  private ListView list; 
  ArrayAdapter<String> Adapter; 
  ArrayList<String> arr=new ArrayList<String>(); 
   
  Context context; 
  private String path; 
   
  private TextView title; 
  private EditText et; 
  private Button home,back,ok; 
  private LinearLayout titleView; 
   
  private int type = 1; 
  private String[] fileType = null; 
   
  public final static int TypeOpen = 1; 
  public final static int TypeSave = 2; 
   
  /** 
   * @param context 
   * @param type   1              ,2                 
   * @param fileType         ,null        
   * @param resultPath  OK       ,      +    
   */ 
  public DirChooserDialog(Context context,int type,String[]fileType,String resultPath) { 
    super(context); 
    // TODO Auto-generated constructor stub 
    this.context = context; 
    this.type = type; 
    this.fileType = fileType; 
    this.path = resultPath; 
  } 
  /* (non-Javadoc) 
   * @see android.app.Dialog#dismiss() 
   */ 
  @Override 
  public void dismiss() { 
    // TODO Auto-generated method stub 
    super.dismiss(); 
  } 
  /* (non-Javadoc) 
   * @see android.app.Dialog#onCreate(android.os.Bundle) 
   */ 
  @Override 
  protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.chooserdialog); 
     
    path = getRootDir(); 
    arr = (ArrayList<String>) getDirs(path); 
    Adapter = new ArrayAdapter<String>(context,android.R.layout.simple_list_item_1, arr); 
     
    list = (ListView)findViewById(R.id.list_dir); 
    list.setAdapter(Adapter); 
     
    list.setOnItemClickListener(lvLis); 
 
    home = (Button) findViewById(R.id.btn_home); 
    home.setOnClickListener(this); 
     
    back = (Button) findViewById(R.id.btn_back); 
    back.setOnClickListener(this); 
     
    ok = (Button) findViewById(R.id.btn_ok); 
    ok.setOnClickListener(this); 
     
    titleView = (LinearLayout) findViewById(R.id.dir_layout); 
     
    if(type == TypeOpen){ 
      title = new TextView(context); 
      titleView.addView(title); 
      title.setText(path); 
    }else if(type == TypeSave){ 
      et = new EditText(context); 
      et.setWidth(240); 
      et.setHeight(70); 
      et.setGravity(Gravity.CENTER); 
      et.setPadding(0, 2, 0, 0); 
      titleView.addView(et); 
      et.setText("wfFileName"); 
    } 
//   title = (TextView) findViewById(R.id.dir_str); 
//   title.setText(path); 
     
  } 
  //    ListView 
  Runnable add=new Runnable(){ 
 
    @Override 
    public void run() { 
      // TODO Auto-generated method stub 
      arr.clear(); 
//System.out.println("Runnable path:"+path); 
 
      //         arr       
      List<String> temp = getDirs(path); 
      for(int i = 0;i < temp.size();i++) 
        arr.add(temp.get(i)); 
      Adapter.notifyDataSetChanged(); 
    }     
  }; 
   
  private OnItemClickListener lvLis=new OnItemClickListener(){ 
    @Override 
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, 
        long arg3) { 
      String temp = (String) arg0.getItemAtPosition(arg2); 
//System.out.println("OnItemClick path1:"+path);       
      if(temp.equals("..")) 
        path = getSubDir(path); 
      else if(path.equals("/")) 
        path = path+temp; 
      else 
        path = path+"/"+temp; 
       
//System.out.println("OnItemClick path2"+path);  
      if(type == TypeOpen) 
        title.setText(path); 
       
      Handler handler=new Handler(); 
      handler.post(add); 
    } 
  }; 
   
  private List<String> getDirs(String ipath){ 
    List<String> file = new ArrayList<String>(); 
//System.out.println("GetDirs path:"+ipath);     
    File[] myFile = new File(ipath).listFiles(); 
    if(myFile == null){ 
      file.add(".."); 
       
    }else 
      for(File f: myFile){ 
        //     
        if(f.isDirectory()){ 
          String tempf = f.toString(); 
          int pos = tempf.lastIndexOf("/"); 
          String subTemp = tempf.substring(pos+1, tempf.length()); 
//         String subTemp = tempf.substring(path.length(),tempf.length()); 
          file.add(subTemp);  
//System.out.println("files in dir:"+subTemp); 
        } 
        //          
        if(f.isFile() && fileType != null){ 
          for(int i = 0;i< fileType.length;i++){ 
            int typeStrLen = fileType[i].length(); 
             
            String fileName = f.getPath().substring(f.getPath().length()- typeStrLen); 
            if (fileName.toLowerCase().equals(fileType[i])) { 
              file.add(f.toString().substring(path.length()+1,f.toString().length()));   
            } 
          } 
        } 
      } 
     
    if(file.size()==0) 
      file.add(".."); 
     
//   System.out.println("file[0]:"+file.get(0)+" File size:"+file.size()); 
    return file; 
  } 
  /* (non-Javadoc) 
   * @see android.view.View.OnClickListener#onClick(android.view.View) 
   */ 
  @Override 
  public void onClick(View v) { 
    // TODO Auto-generated method stub 
    if(v.getId() == home.getId()){ 
      path = getRootDir(); 
      if(type == TypeOpen) 
        title.setText(path);       
      Handler handler=new Handler(); 
      handler.post(add); 
    }else if(v.getId() == back.getId()){ 
      path = getSubDir(path); 
      if(type == TypeOpen) 
        title.setText(path);       
      Handler handler=new Handler(); 
      handler.post(add); 
    }else if(v.getId() == ok.getId()){ 
      dismiss(); 
      if(type == TypeSave) 
        path = path+"/"+et.getEditableText().toString()+".wf"; 
      Toast.makeText(context, path, Toast.LENGTH_SHORT).show(); 
    } 
       
     
  } 
   
  private String getSDPath(){  
      File sdDir = null;  
      boolean sdCardExist = Environment.getExternalStorageState()   
                .equals(android.os.Environment.MEDIA_MOUNTED);  //  sd       
      if(sdCardExist)   
      {                 
       sdDir = Environment.getExternalStorageDirectory();//       
     }   
      if(sdDir == null){ 
//Toast.makeText(context, "No SDCard inside!",Toast.LENGTH_SHORT).show(); 
        return null; 
      } 
      return sdDir.toString();  
       
  }  
   
  private String getRootDir(){ 
    String root = "/"; 
     
    path = getSDPath(); 
    if (path == null) 
      path="/"; 
     
    return root; 
  } 
   
  private String getSubDir(String path){ 
    String subpath = null; 
     
    int pos = path.lastIndexOf("/"); 
     
    if(pos == path.length()){ 
      path = path.substring(0,path.length()-1); 
      pos = path.lastIndexOf("/"); 
    } 
     
    subpath = path.substring(0,pos); 
     
    if(pos == 0) 
      subpath = path; 
     
    return subpath; 
  } 
} 


package hkp.dirchooser;

import android.app.Activity; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
 
public class MainActivity extends Activity { 
  /** Called when the activity is first created. */ 
  @Override 
  public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    Button btn = (Button) findViewById(R.id.btn_open); 
    btn.setOnClickListener(new OnClickListener() { 
       
      @Override 
      public void onClick(View v) { 
        // TODO Auto-generated method stub 
        String path = null; 
        String [] fileType = {"dst"};//           
        DirChooserDialog dlg = new DirChooserDialog(MainActivity.this,2,fileType,path); 
        dlg.setTitle("Choose dst file dir"); 
        dlg.show(); 
         
      } 
    }); 
  } 
} 

좋은 웹페이지 즐겨찾기