【问题标题】:Browse Button required?需要浏览按钮吗?
【发布时间】:2011-04-11 06:09:10
【问题描述】:

您好,我正在开发一个需要使用浏览按钮选择文件的应用程序。 如何在android中实现浏览按钮?

【问题讨论】:

    标签: android


    【解决方案1】:

    以下是我的示例应用程序的完整代码。我使用了一个按钮,可以从您手机的任何目录中选择文件。


    布局

    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 // 这必须是您的默认 Activity,作为清单中的 MAIN

    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.                
                    }
                }
            }
        }
    }
    

    我正在上传图片,您可以使用自己的图片。

    图片名称:文件

    图像名称:文件夹

    最后

    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

    【讨论】:

    • -1 因为发布链接不是一个好的答案。请提供有关您发布的链接的一些详细信息,以便每个人都可以了解他在关注这些链接时可能会发现什么。
    • @WarrenFaith 我更新了我的答案,如果这是给出答案的好方法,你能取消你的反对票吗?而且有时候你忙的时候不能发一些代码,所以通常我会提供链接,如果这不是回答任何问题的好方法,我会照顾它。
    • 这是一个很好的答案,我现在赞成。如果您很忙,要创建一个好的答案,您可以考虑将一些链接作为评论或完全保留(我只是在底部编辑了您的链接名称。1 和 2 不是链接名称的好选择.. .)
    【解决方案2】:

    你需要做的:

    1. 创建一个运行单独活动的按钮(startActivityForResult)。

    2. 此文件选择活动应列出来自特定位置的所有文件和文件夹。如果您单击一个文件夹,则会为该文件夹重新初始化活动(列出其中的文件)。

    3. 如果点击了一个文件,那么活动应该设置结果,将文件名传递给 extras,然后完成。

    【讨论】:

      【解决方案3】:

      这里有一些代码可以用来做一个文件选择器:

      http://www.kaloer.com/android-file-picker-activity

      它有一个 Apache 许可证。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多