2013-04-03 6 views
2

j'ai exactement la même question que ce poste Choose File Dialogfichier Android choisissez à nouveau dialogue

je ne vois aucune réponse vraiment utilisable là-dedans.

idéalement je voudrais un exemple simple de code Java d'un dialogue simple qui fonctionne comme MFC CFileDialog classe, soit vous simplement nouveau, faites un .show et il fonctionne

tout ce que j'ai vu l'air si bien trop compliqué pour ce qui devrait être un travail très simple. quelqu'un peut-il aider avec plus d'informations à jour?

grâce

UPDATE

dans ce poste Choose File Dialog la réponse par Kirill Mikhailov semble fonctionner très bien après quelques minutes essais

Répondre

1

i ajouté un bouton d'annulation à cet exemple, semble fonctionne bien

import java.io.File; 
import java.io.FilenameFilter; 
import java.util.ArrayList; 
import java.util.List; 

import com.design2112.tabtrax.ListenerList.FireHandler; 

import android.app.Activity; 
import android.app.AlertDialog; 
import android.app.Dialog; 
import android.content.DialogInterface; 
import android.os.Environment; 

public class FileDialog { 
    private static final String PARENT_DIR = ".."; 
    private final String TAG = getClass().getName(); 
    private String[] fileList; 
    private File currentPath; 

    public interface FileSelectedListener { 
     void fileSelected(File file); 
    } 

    public interface DirectorySelectedListener { 
     void directorySelected(File directory); 
    } 

    private ListenerList<FileSelectedListener> fileListenerList = new ListenerList<FileDialog.FileSelectedListener>(); 
    private ListenerList<DirectorySelectedListener> dirListenerList = new ListenerList<FileDialog.DirectorySelectedListener>(); 
    private final Activity activity; 
    private boolean selectDirectoryOption; 
    private String fileEndsWith; 

    /** 
    * @param activity 
    * @param initialPath 
    */ 
    public FileDialog(Activity activity, String path) { 
     this.activity = activity; 
     loadFileList(new File(path)); 
    } 

    /** 
    * @return file dialog 
    */ 
    public Dialog createFileDialog() { 
     Dialog dialog = null; 
     AlertDialog.Builder builder = new AlertDialog.Builder(activity); 

     builder.setTitle(currentPath.getPath()); 
     /* 
     * if (selectDirectoryOption) { 
     * builder.setPositiveButton("Select directory", new OnClickListener() { 
     * public void onClick(DialogInterface dialog, int which) { Log.d(TAG, 
     * currentPath.getPath()); fireDirectorySelectedEvent(currentPath); } 
     * }); } 
     */ 

     builder.setItems(fileList, new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) { 
       String fileChosen = fileList[which]; 
       File chosenFile = getChosenFile(fileChosen); 
       if (chosenFile.isDirectory()) { 
        loadFileList(chosenFile); 
        dialog.cancel(); 
        dialog.dismiss(); 
        showDialog(); 
       } else 
        fireFileSelectedEvent(chosenFile); 
      } 
     }); 
     builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) { 
       dialog.dismiss(); 
      } 
     }); 
     dialog = builder.show(); 
     return dialog; 
    } 

    public void addFileListener(FileSelectedListener listener) { 
     fileListenerList.add(listener); 
    } 

    public void removeFileListener(FileSelectedListener listener) { 
     fileListenerList.remove(listener); 
    } 

    public void setSelectDirectoryOption(boolean selectDirectoryOption) { 
     this.selectDirectoryOption = selectDirectoryOption; 
    } 

    public void addDirectoryListener(DirectorySelectedListener listener) { 
     dirListenerList.add(listener); 
    } 

    public void removeDirectoryListener(DirectorySelectedListener listener) { 
     dirListenerList.remove(listener); 
    } 

    /** 
    * Show file dialog 
    */ 
    public void showDialog() { 
     createFileDialog().show(); 
    } 

    private void fireFileSelectedEvent(final File file) { 
     fileListenerList.fireEvent(new FireHandler<FileDialog.FileSelectedListener>() { 
      public void fireEvent(FileSelectedListener listener) { 
       listener.fileSelected(file); 
      } 
     }); 
    } 

    private void fireDirectorySelectedEvent(final File directory) { 
     dirListenerList.fireEvent(new FireHandler<FileDialog.DirectorySelectedListener>() { 
      public void fireEvent(DirectorySelectedListener listener) { 
       listener.directorySelected(directory); 
      } 
     }); 
    } 

    private void loadFileList(File path) { 
     this.currentPath = path; 
     List<String> r = new ArrayList<String>(); 
     if (path.exists()) { 
      if (path.getParentFile() != null) 
       r.add(PARENT_DIR); 
      FilenameFilter filter = new FilenameFilter() { 
       public boolean accept(File dir, String filename) { 
        File sel = new File(dir, filename); 
        if (!sel.canRead()) 
         return false; 
        if (selectDirectoryOption) 
         return sel.isDirectory(); 
        else { 
         boolean endsWith = fileEndsWith != null ? filename 
           .toLowerCase().endsWith(fileEndsWith) : true; 
         return endsWith || sel.isDirectory(); 
        } 
       } 
      }; 
      String[] fileList1 = path.list(filter); 
      for (String file : fileList1) { 
       r.add(file); 
      } 
     } 
     fileList = (String[]) r.toArray(new String[] {}); 
    } 

    private File getChosenFile(String fileChosen) { 
     if (fileChosen.equals(PARENT_DIR)) 
      return currentPath.getParentFile(); 
     else 
      return new File(currentPath, fileChosen); 
    } 

    public void setFileEndsWith(String fileEndsWith) { 
     this.fileEndsWith = fileEndsWith != null ? fileEndsWith.toLowerCase() 
       : fileEndsWith; 
    } 
} 

class ListenerList<L> { 
    private List<L> listenerList = new ArrayList<L>(); 

    public interface FireHandler<L> { 
     void fireEvent(L listener); 
    } 

    public void add(L listener) { 
     listenerList.add(listener); 
    } 

    public void fireEvent(FireHandler<L> fireHandler) { 
     List<L> copy = new ArrayList<L>(listenerList); 
     for (L l : copy) { 
      fireHandler.fireEvent(l); 
     } 
    } 

    public void remove(L listener) { 
     listenerList.remove(listener); 
    } 

    public List<L> getListenerList() { 
     return listenerList; 
    } 
} 
+0

J'ai aussi besoin d'une boîte de dialogue de fichier et je suis nouveau dans l'application dev. ce code va-t-il dans une activité? ou comment puis-je l'utiliser? – kingkode

Questions connexes