2011-04-11 72 views

回答

26

哦,我downvote .....好我正在更新我的答案。我爲示例應用程序提供代碼,其中,我使用了一個按鈕,可以從手機的任何目錄中選擇文件。

佈局

file_picker_empty_view.xml

<TextView 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:text="No files or directories" 
android:background="@android:drawable/toast_frame" 
android:textSize="28sp" 
android:gravity="center_vertical|center_horizontal"/> 

file_picker_list_item.xml

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal" > 
    <ImageView 
     android:id="@+id/file_picker_image" 
     android:layout_width="40dip" 
     android:layout_height="40dip" 
     android:layout_marginTop="5dip" 
     android:layout_marginBottom="5dip" 
     android:layout_marginLeft="5dip" 
     android:src="@drawable/file" 
     android:scaleType="centerCrop"/> 
    <TextView 
     android:id="@+id/file_picker_text" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_weight="1" 
     android:layout_gravity="left|center_vertical" 
     android:textSize="28sp" 
     android:layout_marginLeft="10dip" 
     android:singleLine="true" 
     android:text="filename"/> 
</LinearLayout> 

file_view.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_height="wrap_content" 
android:orientation="vertical" 
android:layout_width="fill_parent"> 
    <TextView android:text="@+id/TextView01" 
    android:id="@+id/TextView01" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:singleLine="true" 
    android:textStyle="bold" 
    android:layout_marginTop="5dip" 
    android:layout_marginLeft="5dip"></TextView> 
    <TextView android:text="@+id/TextView02" 
    android:id="@+id/TextView02" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginLeft="10dip"></TextView> 
</LinearLayout> 

main.xml中

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:gravity="center_vertical"> 
    <Button android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:id="@+id/start_file_picker_button" 
     android:text="Browse" /> 
    <TextView 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="Selected file" 
     android:textStyle="bold" 
     android:textColor="#fff" 
     android:textSize="24sp" /> 
    <TextView 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:id="@+id/file_path_text_view" 
     android:text="No file has been selected" 
     android:textSize="18sp" /> 
</LinearLayout> 

活動

FilePickerActivity

import java.io.File; 
import java.io.FilenameFilter; 
import java.util.ArrayList; 
import java.util.Collections; 
import java.util.Comparator; 
import java.util.List; 
import android.app.ListActivity; 
import android.content.Context; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.ImageView; 
import android.widget.ListView; 
import android.widget.TextView; 

/** 
* 
* @author pankaj 
* 
*/ 
public class FilePickerActivity extends ListActivity { 

    public final static String EXTRA_FILE_PATH = "file_path"; 
    public final static String EXTRA_SHOW_HIDDEN_FILES = "show_hidden_files"; 
    public final static String EXTRA_ACCEPTED_FILE_EXTENSIONS = "accepted_file_extensions"; 
    private final static String DEFAULT_INITIAL_DIRECTORY = "/"; 

    protected File mDirectory; 
    protected ArrayList<File> mFiles; 
    protected FilePickerListAdapter mAdapter; 
    protected boolean mShowHiddenFiles = false; 
    protected String[] acceptedFileExtensions; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     // Set the view to be shown if the list is empty 
     LayoutInflater inflator = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     View emptyView = inflator.inflate(R.layout.file_picker_empty_view, null); 
     ((ViewGroup)getListView().getParent()).addView(emptyView); 
     getListView().setEmptyView(emptyView); 

     // Set initial directory 
     mDirectory = new File(DEFAULT_INITIAL_DIRECTORY); 

     // Initialize the ArrayList 
     mFiles = new ArrayList<File>(); 

     // Set the ListAdapter 
     mAdapter = new FilePickerListAdapter(this, mFiles); 
     setListAdapter(mAdapter); 

     // Initialize the extensions array to allow any file extensions 
     acceptedFileExtensions = new String[] {}; 

     // Get intent extras 
     if(getIntent().hasExtra(EXTRA_FILE_PATH)) { 
      mDirectory = new File(getIntent().getStringExtra(EXTRA_FILE_PATH)); 
     } 
     if(getIntent().hasExtra(EXTRA_SHOW_HIDDEN_FILES)) { 
      mShowHiddenFiles = getIntent().getBooleanExtra(EXTRA_SHOW_HIDDEN_FILES, false); 
     } 
     if(getIntent().hasExtra(EXTRA_ACCEPTED_FILE_EXTENSIONS)) { 
      ArrayList<String> collection = getIntent().getStringArrayListExtra(EXTRA_ACCEPTED_FILE_EXTENSIONS); 
      acceptedFileExtensions = (String[]) collection.toArray(new String[collection.size()]); 
     } 
    } 

    @Override 
    protected void onResume() { 
     refreshFilesList(); 
     super.onResume(); 
    } 

    /** 
    * Updates the list view to the current directory 
    */ 
    protected void refreshFilesList() { 
     // Clear the files ArrayList 
     mFiles.clear(); 

     // Set the extension file filter 
     ExtensionFilenameFilter filter = new ExtensionFilenameFilter(acceptedFileExtensions); 

     // Get the files in the directory 
     File[] files = mDirectory.listFiles(filter); 
     if(files != null && files.length > 0) { 
      for(File f : files) { 
       if(f.isHidden() && !mShowHiddenFiles) { 
        // Don't add the file 
        continue; 
       } 

       // Add the file the ArrayAdapter 
       mFiles.add(f); 
      } 

      Collections.sort(mFiles, new FileComparator()); 
     } 
     mAdapter.notifyDataSetChanged(); 
    } 

    @Override 
    public void onBackPressed() { 
     if(mDirectory.getParentFile() != null) { 
      // Go to parent directory 
      mDirectory = mDirectory.getParentFile(); 
      refreshFilesList(); 
      return; 
     } 

     super.onBackPressed(); 
    } 

    @Override 
    protected void onListItemClick(ListView l, View v, int position, long id) { 
     File newFile = (File)l.getItemAtPosition(position); 

     if(newFile.isFile()) { 
      // Set result 
      Intent extra = new Intent(); 
      extra.putExtra(EXTRA_FILE_PATH, newFile.getAbsolutePath()); 
      setResult(RESULT_OK, extra); 
      // Finish the activity 
      finish(); 
     } else { 
      mDirectory = newFile; 
      // Update the files list 
      refreshFilesList(); 
     } 

     super.onListItemClick(l, v, position, id); 
    } 

    private class FilePickerListAdapter extends ArrayAdapter<File> { 

     private List<File> mObjects; 

     public FilePickerListAdapter(Context context, List<File> objects) { 
      super(context, R.layout.file_picker_list_item, android.R.id.text1, objects); 
      mObjects = objects; 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 

      View row = null; 

      if(convertView == null) { 
       LayoutInflater inflater = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
       row = inflater.inflate(R.layout.file_picker_list_item, parent, false); 
      } else { 
       row = convertView; 
      } 

      File object = mObjects.get(position); 

      ImageView imageView = (ImageView)row.findViewById(R.id.file_picker_image); 
      TextView textView = (TextView)row.findViewById(R.id.file_picker_text); 
      // Set single line 
      textView.setSingleLine(true); 

      textView.setText(object.getName()); 
      if(object.isFile()) { 
       // Show the file icon 
       imageView.setImageResource(R.drawable.file); 
      } else { 
       // Show the folder icon 
       imageView.setImageResource(R.drawable.folder); 
      } 

      return row; 
     } 

    } 

    private class FileComparator implements Comparator<File> { 
     public int compare(File f1, File f2) { 
      if(f1 == f2) { 
       return 0; 
      } 
      if(f1.isDirectory() && f2.isFile()) { 
       // Show directories above files 
       return -1; 
      } 
      if(f1.isFile() && f2.isDirectory()) { 
       // Show files below directories 
       return 1; 
      } 
      // Sort the directories alphabetically 
      return f1.getName().compareToIgnoreCase(f2.getName()); 
     } 
    } 

    private class ExtensionFilenameFilter implements FilenameFilter { 
     private String[] mExtensions; 

     public ExtensionFilenameFilter(String[] extensions) { 
      super(); 
      mExtensions = extensions; 
     } 

     public boolean accept(File dir, String filename) { 
      if(new File(dir, filename).isDirectory()) { 
       // Accept all directory names 
       return true; 
      } 
      if(mExtensions != null && mExtensions.length > 0) { 
       for(int i = 0; i < mExtensions.length; i++) { 
        if(filename.endsWith(mExtensions[i])) { 
         // The filename ends with the extension 
         return true; 
        } 
       } 
       // The filename did not match any of the extensions 
       return false; 
      } 
      // No extensions has been set. Accept all file extensions. 
      return true; 
     } 
    } 
} 

MainActivity //這必須是默認的活動,作爲主要的清單中

public class MainActivity extends Activity implements OnClickListener { 

    private static final int REQUEST_PICK_FILE = 1; 

    private TextView mFilePathTextView; 
    private Button mStartActivityButton; 
    private File selectedFile; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     // Set the views 
     mFilePathTextView = (TextView)findViewById(R.id.file_path_text_view); 
     mStartActivityButton = (Button)findViewById(R.id.start_file_picker_button); 
     mStartActivityButton.setOnClickListener(this);  
    } 

    public void onClick(View v) { 
     switch(v.getId()) { 
     case R.id.start_file_picker_button: 
      // Create a new Intent for the file picker activity 
      Intent intent = new Intent(this, FilePickerActivity.class); 

      // Set the initial directory to be the sdcard 
      //intent.putExtra(FilePickerActivity.EXTRA_FILE_PATH, Environment.getExternalStorageDirectory()); 

      // Show hidden files 
      //intent.putExtra(FilePickerActivity.EXTRA_SHOW_HIDDEN_FILES, true); 

      // Only make .png files visible 
      //ArrayList<String> extensions = new ArrayList<String>(); 
      //extensions.add(".png"); 
      //intent.putExtra(FilePickerActivity.EXTRA_ACCEPTED_FILE_EXTENSIONS, extensions); 

      // Start the activity 
      startActivityForResult(intent, REQUEST_PICK_FILE); 
      break; 

     case R.id.You_can_handle_more_onclick_events_from_here: 
      //Do something 
      break; 
     } 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if(resultCode == RESULT_OK) { 
      switch(requestCode) { 
      case REQUEST_PICK_FILE: 
       if(data.hasExtra(FilePickerActivity.EXTRA_FILE_PATH)) { 
        // Get the file path 
        selectedFile = new File(data.getStringExtra(FilePickerActivity.EXTRA_FILE_PATH)); 
        // Set the file path text view 
        mFilePathTextView.setText(selectedFile.getPath()); 
        //Now you have your selected file, You can do your additional requirement with file.     
       } 
      } 
     } 
    } 
} 

現在Iam上傳圖片,你可以ñ使用你自己的圖像。

圖片名稱:文件

enter image description here

圖片名稱:文件夾

enter image description here

最後

AndroidManifest.xml中

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
     package="org.myContactAdder.adder" 
     android:versionCode="1" 
     android:versionName="1.0"> 
     <uses-permission android:name="android.permission.READ_CONTACTS" /> 
     <uses-permission android:name="android.permission.WRITE_CONTACTS" /> 
    <application android:icon="@drawable/icon" android:label="@string/app_name"> 
     <activity android:name=".FilePickerActivity" 
        android:label="@string/app_name"> 
     </activity> 
     <activity android:name=".MainActivity" 
        android:label="@string/app_name"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 
    <uses-sdk android:minSdkVersion="7" /> 

</manifest> 

這些是更多信息的鏈接:Android file picker ActivityCreating simple file chooser

+0

-1因爲發佈鏈接不是一個好的答案。請提供一些關於您發佈的鏈接的詳細信息,以便每個人都可以瞭解他在跟蹤他們時可能找到的內容。 – WarrenFaith 2011-04-29 10:07:35

+0

@WarrenFaith我更新了我的答案,如果這是給出答案的好方法,您可以取消你的倒票嗎?有些時候你很忙,那麼你不能發佈一些代碼,所以通常我會鏈接,如果不是回答任何問題的好方法,我會照顧它的。 – 2011-04-30 19:40:06

+0

這現在是一個相當不錯的答案,我現在積極投票。如果你很忙,爲了創建一個好的答案,你可以考慮把一些鏈接作爲評論或者完全放棄它(我只是在底部編輯你的鏈接名稱,1和2不是一個好的選擇鏈接名稱.. ) – WarrenFaith 2011-05-01 11:02:44

3

你需要做的:

  1. 創建運行在獨立的活動(startActivityForResult)按鈕。

  2. 此文件選擇活動應列出來自特定位置的所有文件和文件夾。如果您單擊某個文件夾,則該文件夾的活動將重新初始化(從中列出文件)。

  3. 如果一個文件被點擊,那麼活動應該設置結果,傳遞文件名在extras中,並完成。