码迷,mamicode.com
首页 > 移动开发 > 详细

android打开文件、保存对话框、创建新文件夹对话框(转载)

时间:2015-07-14 17:44:07      阅读:247      评论:0      收藏:0      [点我收藏+]

标签:

转载地址:点击打开

这是一个简单的只有3个按钮的程序,3个按钮分别对应三种工作的模式(保存、打开和文件夹选择)。封装的SimpleFileDialog.java的内容如下:

package com.example.test;

/*
 * 
 * This file is licensed under The Code Project Open License (CPOL) 1.02 
 * http://www.codeproject.com/info/cpol10.aspx
 * http://www.codeproject.com/info/CPOL.zip
 * 
 * License Preamble:
 * This License governs Your use of the Work. This License is intended to allow developers to use the Source
 * Code and Executable Files provided as part of the Work in any application in any form.
 * 
 * The main points subject to the terms of the License are:
 *    Source Code and Executable Files can be used in commercial applications;
 *    Source Code and Executable Files can be redistributed; and
 *    Source Code can be modified to create derivative works.
 *    No claim of suitability, guarantee, or any warranty whatsoever is provided. The software is provided "as-is".
 *    The Article(s) accompanying the Work may not be distributed or republished without the Author‘s consent
 * 
 * This License is entered between You, the individual or other entity reading or otherwise making use of
 * the Work licensed pursuant to this License and the individual or other entity which offers the Work
 * under the terms of this License ("Author").
 *  (See Links above for full license text)
 */

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
//import android.content.DialogInterface.OnKeyListener;
import android.os.Environment;
import android.text.Editable;
import android.view.Gravity;
//import android.view.KeyEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

public class SimpleFileDialog {
    private int FileOpen = 0;
    private int FileSave = 1;
    private int FolderChoose = 2;
    private int Select_type = FileSave;
    private String m_sdcardDirectory = "";
    private Context m_context;
    private TextView m_titleView1;
    private TextView m_titleView;
    public String Default_File_Name = "default.txt";
    private String Selected_File_Name = Default_File_Name;
    private EditText input_text;

    private String m_dir = "";
    private List<String> m_subdirs = null;
    private SimpleFileDialogListener m_SimpleFileDialogListener = null;
    private ArrayAdapter<String> m_listAdapter = null;

    // ////////////////////////////////////////////////////
    // Callback interface for selected directory
    // ////////////////////////////////////////////////////
    public interface SimpleFileDialogListener {
        public void onChosenDir(String chosenDir);
    }

    public SimpleFileDialog(Context context, String file_select_type,
            SimpleFileDialogListener SimpleFileDialogListener) {
        if (file_select_type.equals("FileOpen"))
            Select_type = FileOpen;
        else if (file_select_type.equals("FileSave"))
            Select_type = FileSave;
        else if (file_select_type.equals("FolderChoose"))
            Select_type = FolderChoose;
        else
            Select_type = FileOpen;

        m_context = context;
        m_sdcardDirectory = Environment.getExternalStorageDirectory()
                .getAbsolutePath();
        m_SimpleFileDialogListener = SimpleFileDialogListener;

        try {
            m_sdcardDirectory = new File(m_sdcardDirectory).getCanonicalPath();
        } catch (IOException ioe) {
        }
    }

    // /////////////////////////////////////////////////////////////////////
    // chooseFile_or_Dir() - load directory chooser dialog for initial
    // default sdcard directory
    // /////////////////////////////////////////////////////////////////////
    public void chooseFile_or_Dir() {
        // Initial directory is sdcard directory
        if (m_dir.equals(""))
            chooseFile_or_Dir(m_sdcardDirectory);
        else
            chooseFile_or_Dir(m_dir);
    }

    // //////////////////////////////////////////////////////////////////////////////
    // chooseFile_or_Dir(String dir) - load directory chooser dialog for initial
    // input ‘dir‘ directory
    // //////////////////////////////////////////////////////////////////////////////
    public void chooseFile_or_Dir(String dir) {
        File dirFile = new File(dir);
        if (!dirFile.exists() || !dirFile.isDirectory()) {
            dir = m_sdcardDirectory;
        }

        try {
            dir = new File(dir).getCanonicalPath();
        } catch (IOException ioe) {
            return;
        }

        m_dir = dir;
        m_subdirs = getDirectories(dir);

        class SimpleFileDialogOnClickListener implements
                DialogInterface.OnClickListener {
            public void onClick(DialogInterface dialog, int item) {
                String m_dir_old = m_dir;
                String sel = ""
                        + ((AlertDialog) dialog).getListView().getAdapter()
                                .getItem(item);
                if (sel.charAt(sel.length() - 1) == ‘/‘)
                    sel = sel.substring(0, sel.length() - 1);

                // Navigate into the sub-directory
                if (sel.equals("..")) {
                    m_dir = m_dir.substring(0, m_dir.lastIndexOf("/"));
                } else {
                    m_dir += "/" + sel;
                }
                Selected_File_Name = Default_File_Name;

                if ((new File(m_dir).isFile())) // If the selection is a regular
                                                // file
                {
                    m_dir = m_dir_old;
                    Selected_File_Name = sel;
                }

                updateDirectory();
            }
        }

        AlertDialog.Builder dialogBuilder = createDirectoryChooserDialog(dir,
                m_subdirs, new SimpleFileDialogOnClickListener());

        dialogBuilder.setPositiveButton("OK", new OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                // Current directory chosen
                // Call registered listener supplied with the chosen directory
                if (m_SimpleFileDialogListener != null) {
                    {
                        if (Select_type == FileOpen || Select_type == FileSave) {
                            Selected_File_Name = input_text.getText() + "";
                            m_SimpleFileDialogListener.onChosenDir(m_dir + "/"
                                    + Selected_File_Name);
                        } else {
                            m_SimpleFileDialogListener.onChosenDir(m_dir);
                        }
                    }
                }
            }
        }).setNegativeButton("Cancel", null);

        final AlertDialog dirsDialog = dialogBuilder.create();

        // Show directory chooser dialog
        dirsDialog.show();
    }

    private boolean createSubDir(String newDir) {
        File newDirFile = new File(newDir);
        if (!newDirFile.exists())
            return newDirFile.mkdir();
        else
            return false;
    }

    private List<String> getDirectories(String dir) {
        List<String> dirs = new ArrayList<String>();
        try {
            File dirFile = new File(dir);

            // if directory is not the base sd card directory add ".." for going
            // up one directory
            if (!m_dir.equals(m_sdcardDirectory))
                dirs.add("..");

            if (!dirFile.exists() || !dirFile.isDirectory()) {
                return dirs;
            }

            for (File file : dirFile.listFiles()) {
                if (file.isDirectory()) {
                    // Add "/" to directory names to identify them in the list
                    dirs.add(file.getName() + "/");
                } else if (Select_type == FileSave || Select_type == FileOpen) {
                    // Add file names to the list if we are doing a file save or
                    // file open operation
                    dirs.add(file.getName());
                }
            }
        } catch (Exception e) {
        }

        Collections.sort(dirs, new Comparator<String>() {
            public int compare(String o1, String o2) {
                return o1.compareTo(o2);
            }
        });
        return dirs;
    }

    // ////////////////////////////////////////////////////////////////////////////////////////////////////////
    // //// START DIALOG DEFINITION //////
    // ////////////////////////////////////////////////////////////////////////////////////////////////////////
    private AlertDialog.Builder createDirectoryChooserDialog(String title,
            List<String> listItems,
            DialogInterface.OnClickListener onClickListener) {
        AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(m_context);
        // //////////////////////////////////////////////
        // Create title text showing file select type //
        // //////////////////////////////////////////////
        m_titleView1 = new TextView(m_context);
        m_titleView1.setLayoutParams(new LayoutParams(
                LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
        // m_titleView1.setTextAppearance(m_context,
        // android.R.style.TextAppearance_Large);
        // m_titleView1.setTextColor(
        // m_context.getResources().getColor(android.R.color.black) );

        if (Select_type == FileOpen)
            m_titleView1.setText("Open:");
        if (Select_type == FileSave)
            m_titleView1.setText("Save As:");
        if (Select_type == FolderChoose)
            m_titleView1.setText("Folder Select:");

        // need to make this a variable Save as, Open, Select Directory
        m_titleView1.setGravity(Gravity.CENTER_VERTICAL);
        m_titleView1.setBackgroundColor(-12303292); // dark gray -12303292
        m_titleView1.setTextColor(m_context.getResources().getColor(
                android.R.color.white));

        // Create custom view for AlertDialog title
        LinearLayout titleLayout1 = new LinearLayout(m_context);
        titleLayout1.setOrientation(LinearLayout.VERTICAL);
        titleLayout1.addView(m_titleView1);

        if (Select_type == FolderChoose || Select_type == FileSave) {
            // /////////////////////////////
            // Create New Folder Button //
            // /////////////////////////////
            Button newDirButton = new Button(m_context);
            newDirButton.setLayoutParams(new LayoutParams(
                    LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
            newDirButton.setText("New Folder");
            newDirButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    final EditText input = new EditText(m_context);

                    // Show new folder name input dialog
                    new AlertDialog.Builder(m_context)
                            .setTitle("New Folder Name")
                            .setView(input)
                            .setPositiveButton("OK",
                                    new DialogInterface.OnClickListener() {
                                        public void onClick(
                                                DialogInterface dialog,
                                                int whichButton) {
                                            Editable newDir = input.getText();
                                            String newDirName = newDir
                                                    .toString();
                                            // Create new directory
                                            if (createSubDir(m_dir + "/"
                                                    + newDirName)) {
                                                // Navigate into the new
                                                // directory
                                                m_dir += "/" + newDirName;
                                                updateDirectory();
                                            } else {
                                                Toast.makeText(
                                                        m_context,
                                                        "Failed to create ‘"
                                                                + newDirName
                                                                + "‘ folder",
                                                        Toast.LENGTH_SHORT)
                                                        .show();
                                            }
                                        }
                                    }).setNegativeButton("Cancel", null).show();
                }
            });
            titleLayout1.addView(newDirButton);
        }

        // ///////////////////////////////////////////////////
        // Create View with folder path and entry text box //
        // ///////////////////////////////////////////////////
        LinearLayout titleLayout = new LinearLayout(m_context);
        titleLayout.setOrientation(LinearLayout.VERTICAL);

        m_titleView = new TextView(m_context);
        m_titleView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
                LayoutParams.WRAP_CONTENT));
        m_titleView.setBackgroundColor(-12303292); // dark gray -12303292
        m_titleView.setTextColor(m_context.getResources().getColor(
                android.R.color.white));
        m_titleView.setGravity(Gravity.CENTER_VERTICAL);
        m_titleView.setText(title);

        titleLayout.addView(m_titleView);

        if (Select_type == FileOpen || Select_type == FileSave) {
            input_text = new EditText(m_context);
            input_text.setText(Default_File_Name);
            titleLayout.addView(input_text);
        }
        // ////////////////////////////////////////
        // Set Views and Finish Dialog builder //
        // ////////////////////////////////////////
        dialogBuilder.setView(titleLayout);
        dialogBuilder.setCustomTitle(titleLayout1);
        m_listAdapter = createListAdapter(listItems);
        dialogBuilder.setSingleChoiceItems(m_listAdapter, -1, onClickListener);
        dialogBuilder.setCancelable(false);
        return dialogBuilder;
    }

    private void updateDirectory() {
        m_subdirs.clear();
        m_subdirs.addAll(getDirectories(m_dir));
        m_titleView.setText(m_dir);
        m_listAdapter.notifyDataSetChanged();
        // #scorch
        if (Select_type == FileSave || Select_type == FileOpen) {
            input_text.setText(Selected_File_Name);
        }
    }

    private ArrayAdapter<String> createListAdapter(List<String> items) {
        return new ArrayAdapter<String>(m_context,
                android.R.layout.select_dialog_item, android.R.id.text1, items) {
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                View v = super.getView(position, convertView, parent);
                if (v instanceof TextView) {
                    // Enable list item (directory) text wrapping
                    TextView tv = (TextView) v;
                    tv.getLayoutParams().height = LayoutParams.WRAP_CONTENT;
                    tv.setEllipsize(null);
                }
                return v;
            }
        };
    }
}

 

MainActivity.java:

package com.example.test;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity {

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

        //Button1
        Button dirChooserButton1 = (Button) findViewById(R.id.button1);
        dirChooserButton1.setOnClickListener(new OnClickListener() 
        {
            String m_chosen;
            @Override
            public void onClick(View v) {
                /////////////////////////////////////////////////////////////////////////////////////////////////
                //Create FileOpenDialog and register a callback
                /////////////////////////////////////////////////////////////////////////////////////////////////
                SimpleFileDialog FileOpenDialog =  new SimpleFileDialog(MainActivity.this, "FileOpen",
                        new SimpleFileDialog.SimpleFileDialogListener()
                {
                    @Override
                    public void onChosenDir(String chosenDir) 
                    {
                        // The code in this function will be executed when the dialog OK button is pushed 
                        m_chosen = chosenDir;
                        Toast.makeText(MainActivity.this, "Chosen FileOpenDialog File: " + 
                                m_chosen, Toast.LENGTH_LONG).show();
                    }
                });
                
                //You can change the default filename using the public variable "Default_File_Name"
                FileOpenDialog.Default_File_Name = "";
                FileOpenDialog.chooseFile_or_Dir();
                
                /////////////////////////////////////////////////////////////////////////////////////////////////

            }
        });
        
        //Button2
        Button dirChooserButton2 = (Button) findViewById(R.id.button2);
        dirChooserButton2.setOnClickListener(new OnClickListener() 
        {
            String m_chosen;
            @Override
            public void onClick(View v) {
                /////////////////////////////////////////////////////////////////////////////////////////////////
                //Create FileSaveDialog and register a callback
                /////////////////////////////////////////////////////////////////////////////////////////////////
                SimpleFileDialog FileSaveDialog =  new SimpleFileDialog(MainActivity.this, "FileSave",
                        new SimpleFileDialog.SimpleFileDialogListener()
                {
                    @Override
                    public void onChosenDir(String chosenDir) 
                    {
                        // The code in this function will be executed when the dialog OK button is pushed
                        m_chosen = chosenDir;
                        Toast.makeText(MainActivity.this, "Chosen FileOpenDialog File: " + 
                                m_chosen, Toast.LENGTH_LONG).show();
                    }
                });
                
                //You can change the default filename using the public variable "Default_File_Name"
                FileSaveDialog.Default_File_Name = "my_default.txt";
                FileSaveDialog.chooseFile_or_Dir();
                
                /////////////////////////////////////////////////////////////////////////////////////////////////

            }
        });
        
        //Button3
        Button dirChooserButton3 = (Button) findViewById(R.id.button3);
        dirChooserButton3.setOnClickListener(new OnClickListener() 
        {
            String m_chosen;
            @Override
            public void onClick(View v) {
                
                /////////////////////////////////////////////////////////////////////////////////////////////////
                //Create FileOpenDialog and register a callback
                /////////////////////////////////////////////////////////////////////////////////////////////////
                SimpleFileDialog FolderChooseDialog =  new SimpleFileDialog(MainActivity.this, "FolderChoose",
                        new SimpleFileDialog.SimpleFileDialogListener()
                {
                    @Override
                    public void onChosenDir(String chosenDir) 
                    {
                        // The code in this function will be executed when the dialog OK button is pushed
                        m_chosen = chosenDir;
                        Toast.makeText(MainActivity.this, "Chosen FileOpenDialog File: " + 
                                m_chosen, Toast.LENGTH_LONG).show();
                    }
                });
                
                FolderChooseDialog.chooseFile_or_Dir();
                
                /////////////////////////////////////////////////////////////////////////////////////////////////
                
            }
        });
        
    }
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}

 

当然需要相应的权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

最后来几张图片:

技术分享技术分享技术分享

android打开文件、保存对话框、创建新文件夹对话框(转载)

标签:

原文地址:http://www.cnblogs.com/sowhat4999/p/4645702.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!