Dosya İletişim Kutusunu Seçin [kapalı]


146

Tam bir dosya seçme diyaloğunu bilen var mı? Belki de belirli uzantılara sahip olanlar dışındaki tüm dosyaları filtreleyebileceğiniz bir yer?

Projelerimden birine kolayca uygulayacak kadar hafif bir şey bulamadım. Diğer tek seçenek, OI FileManager'ın açık amaçlarını kullanıyor gibi görünüyor, ancak bu, kullanıcının dosya yöneticisinin zaten kurulu olmasını gerektirir.

Birisi, kullanıcının klasörlere göz atmasına ve bir dosya seçmesine ve yolu geri döndürmesine olanak tanıyan bir Diyaloğu işaret edebilirse minnettar olurum.


5
Dediğiniz gibi, "İnternetin böyle bir örneğe ihtiyacı varsa", o zaman bu SİZİN bu kadar asil bir amaç için bir örnek oluşturma fırsatınızdır. SO bir "kodlayıcı kiralama" sitesi değildir. Öte yandan, bir dosya seçimi iletişim kutusu oluşturmaya / kullanmaya ve sorunlarla karşılaşmaya çalışıyorsanız, o zaman özel sorunuzla geleceğiniz yer burasıdır.
Cal Jacobson


33
Soru şudur: ALLREADY gibi bir şey varsa, ki bu iyi bir şeydir, çünkü çukuru yeniden icat etmek istemezsiniz.
Velrok

9
Bu soru kapatılmamalıdır. AFileChooser ( github.com/iPaulPro/aFileChooser ) ile bir cevap gönderecektim ama yapamıyorum, bu yüzden bu yorumu görmek isteyenler umalım.
Tiago

2
Katılıyorum, bu yararlı bir soru. Cevaplara bu basit tek sınıflı uygulamaya katkıda bulunmayı umuyordum: ninthavenue.com.au/simple-android-file-chooser
Roger Keays

Yanıtlar:


184

Sadece onCreateDialogbir Aktivitede geçersiz kılmanız gerekir .

//In an Activity
private String[] mFileList;
private File mPath = new File(Environment.getExternalStorageDirectory() + "//yourdir//");
private String mChosenFile;
private static final String FTYPE = ".txt";    
private static final int DIALOG_LOAD_FILE = 1000;

private void loadFileList() {
    try {
        mPath.mkdirs();
    }
    catch(SecurityException e) {
        Log.e(TAG, "unable to write on the sd card " + e.toString());
    }
    if(mPath.exists()) {
        FilenameFilter filter = new FilenameFilter() {

            @Override
            public boolean accept(File dir, String filename) {
                File sel = new File(dir, filename);
                return filename.contains(FTYPE) || sel.isDirectory();
            }

        };
        mFileList = mPath.list(filter);
    }
    else {
        mFileList= new String[0];
    }
}

protected Dialog onCreateDialog(int id) {
    Dialog dialog = null;
    AlertDialog.Builder builder = new Builder(this);

    switch(id) {
        case DIALOG_LOAD_FILE:
            builder.setTitle("Choose your file");
            if(mFileList == null) {
                Log.e(TAG, "Showing file picker before loading the file list");
                dialog = builder.create();
                return dialog;
            }
            builder.setItems(mFileList, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    mChosenFile = mFileList[which];
                    //you can do stuff with the file here too
                }
            });
            break;
    }
    dialog = builder.show();
    return dialog;
}

4
Klasörlerde gezinme ve ana klasöre gitme yeteneği ekleyin ve bunu
anladınız

49
Dosya sisteminde gezinmek için yukarıdakileri değiştiremezseniz, ilk olarak uygulamanıza nasıl aşılayacağınızı bilmiyorum. Zaten "kuralları" esnetip kodu sizin için yazdığında, umarım bunun için ödül fidye tutmazsınız.
Blumer

6
Klasörlerin nasıl ekleneceğini göstermek için yukarıdaki kodu düzenledim. Gerisini çözebilmelisin. Basılan dosyanın onClick içinde bir dizin olduğunu tespit ederseniz, sadece yeni yolu ayarlayın ve onCreateDialog'u tekrar çağırın.
Nathan Schwermann

1
Hey "Environmet" ne demek, bir değişken, aslında sizin kodunuzu kullanıyorum ve onun "Çevre" ne olduğunu algılayamıyorum.
TRonZ

6
Manifest'e <uses-
allow

73

Fikir için Thanx schwiz! İşte değiştirilmiş çözüm:

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, File initialPath) {
        this(activity, initialPath, null);
    }

    public FileDialog(Activity activity, File initialPath, String fileEndsWith) {
        this.activity = activity;
        setFileEndsWith(fileEndsWith);
        if (!initialPath.exists()) initialPath = Environment.getExternalStorageDirectory();
            loadFileList(initialPath);
    }

    /**
    * @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);
            }
        });

        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);
    }

    private 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;
    }
}

OnCreate etkinliğinde kullanın (dizin seçimi seçeneği yorumlanmıştır):

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    File mPath = new File(Environment.getExternalStorageDirectory() + "//DIR//");
    fileDialog = new FileDialog(this, mPath, ".txt");
    fileDialog.addFileListener(new FileDialog.FileSelectedListener() {
        public void fileSelected(File file) {
            Log.d(getClass().getName(), "selected file " + file.toString());
        }
    });
    //fileDialog.addDirectoryListener(new FileDialog.DirectorySelectedListener() {
    //  public void directorySelected(File directory) {
    //      Log.d(getClass().getName(), "selected dir " + directory.toString());
    //  }
    //});
    //fileDialog.setSelectDirectoryOption(false);
    fileDialog.showDialog();
}

8
Harika bir yardımcı sınıf! Küçük bir aksaklık buldum - ilk çalıştırmada loadFileList () dosya uzantısına göre filtrelemeyecek çünkü henüz SetFileEndsWith tarafından ayarlanmayacak. Üçüncü parametre fileEnsWith'i kabul etmek için kurucuyu yeniden çalıştım ve loadFileList () çağrısından önce yapıcıda ayarladım.
southerton

merhaba güzel kod, teşekkürler. bu kod birden fazla dosya formatı seçebilir, yani fileDialog.setFileEndsWith (". txt", ". pdf"); veya fileDialog.setFileEndsWith ("fle / *"); lütfen cevaplayın
Anitha

Hayır. Ancak, değiştirilmesi oldukça kolaydır. Sorun şu ki .setFileEndsWith (), dosya listesi yapıcıda tahsis edildiğinden, hiç çalışmıyor. Yapıcıyı birden çok girişi kabul edecek şekilde değiştirmeniz ve ardından satırı değiştirmeniz gerekir: "boolean startsWith = fileEndsWith! = Null? Filename.toLowerCase () .endsWith (fileEndsWith): true;" Veri yapınız ne olursa olsun doğru şekilde eşleşecek. Oldukça önemsiz bir değişiklik.
Tatarize

Tüm bu korkunç dinleyici listeleri ve fireEvent (FireHandler <OMG>) gereksiz görünüyor (birisi bunları kullandı mı?), Ancak kod çalışıyor.
18446744073709551615

merhaba, harika yardımcı sınıf için teşekkürler. Bunun içinCanceledOnTouchOutside'ı nasıl ayarlayabilirim. Gösteri yönteminde FileDialog eklendi ama benim için doesnt iş
Dauezevy

15

Size FolderLayoutyardımcı olabilecek bir yarattım . Bu bağlantı bana yardımcı oldu

folderview.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView android:id="@+id/path" android:text="Path"
        android:layout_width="match_parent" android:layout_height="wrap_content"></TextView>
    <ListView android:layout_width="fill_parent"
        android:layout_height="wrap_content" android:id="@+id/list"></ListView>

</LinearLayout>

FolderLayout.java

package com.testsample.activity;




   public class FolderLayout extends LinearLayout implements OnItemClickListener {

    Context context;
    IFolderItemListener folderListener;
    private List<String> item = null;
    private List<String> path = null;
    private String root = "/";
    private TextView myPath;
    private ListView lstView;

    public FolderLayout(Context context, AttributeSet attrs) {
        super(context, attrs);

        // TODO Auto-generated constructor stub
        this.context = context;


        LayoutInflater layoutInflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View view = layoutInflater.inflate(R.layout.folderview, this);

        myPath = (TextView) findViewById(R.id.path);
        lstView = (ListView) findViewById(R.id.list);

        Log.i("FolderView", "Constructed");
        getDir(root, lstView);

    }

    public void setIFolderItemListener(IFolderItemListener folderItemListener) {
        this.folderListener = folderItemListener;
    }

    //Set Directory for view at anytime
    public void setDir(String dirPath){
        getDir(dirPath, lstView);
    }


    private void getDir(String dirPath, ListView v) {

        myPath.setText("Location: " + dirPath);
        item = new ArrayList<String>();
        path = new ArrayList<String>();
        File f = new File(dirPath);
        File[] files = f.listFiles();

        if (!dirPath.equals(root)) {

            item.add(root);
            path.add(root);
            item.add("../");
            path.add(f.getParent());

        }
        for (int i = 0; i < files.length; i++) {
            File file = files[i];
            path.add(file.getPath());
            if (file.isDirectory())
                item.add(file.getName() + "/");
            else
                item.add(file.getName());

        }

        Log.i("Folders", files.length + "");

        setItemList(item);

    }

    //can manually set Item to display, if u want
    public void setItemList(List<String> item){
        ArrayAdapter<String> fileList = new ArrayAdapter<String>(context,
                R.layout.row, item);

        lstView.setAdapter(fileList);
        lstView.setOnItemClickListener(this);
    }


    public void onListItemClick(ListView l, View v, int position, long id) {
        File file = new File(path.get(position));
        if (file.isDirectory()) {
            if (file.canRead())
                getDir(path.get(position), l);
            else {
//what to do when folder is unreadable
                if (folderListener != null) {
                    folderListener.OnCannotFileRead(file);

                }

            }
        } else {

//what to do when file is clicked
//You can add more,like checking extension,and performing separate actions
            if (folderListener != null) {
                folderListener.OnFileClicked(file);
            }

        }
    }

    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
        // TODO Auto-generated method stub
        onListItemClick((ListView) arg0, arg0, arg2, arg3);
    }

}

Ve bir tıklandığında IFolderItemListenerne yapılacağını eklemek için bir ArayüzfileItem

IFolderItemListener.java

public interface IFolderItemListener {

    void OnCannotFileRead(File file);//implement what to do folder is Unreadable
    void OnFileClicked(File file);//What to do When a file is clicked
}

Ayrıca satırı tanımlamak için bir xml

row.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/rowtext" android:layout_width="fill_parent"
    android:textSize="23sp" android:layout_height="match_parent"/>

Uygulamanızda Nasıl Kullanılır

XML'nizde,

klasörler.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent"
    android:orientation="horizontal" android:weightSum="1">
    <com.testsample.activity.FolderLayout android:layout_height="match_parent" layout="@layout/folderview"
        android:layout_weight="0.35"
        android:layout_width="200dp" android:id="@+id/localfolders"></com.testsample.activity.FolderLayout></LinearLayout>

Faaliyetinizde,

SampleFolderActivity.java

public class SampleFolderActivity extends Activity implements IFolderItemListener {

    FolderLayout localFolders;

    /** Called when the activity is first created. */

    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        localFolders = (FolderLayout)findViewById(R.id.localfolders);
        localFolders.setIFolderItemListener(this);
            localFolders.setDir("./sys");//change directory if u want,default is root   

    }

    //Your stuff here for Cannot open Folder
    public void OnCannotFileRead(File file) {
        // TODO Auto-generated method stub
        new AlertDialog.Builder(this)
        .setIcon(R.drawable.icon)
        .setTitle(
                "[" + file.getName()
                        + "] folder can't be read!")
        .setPositiveButton("OK",
                new DialogInterface.OnClickListener() {

                    public void onClick(DialogInterface dialog,
                            int which) {


                    }
                }).show();

    }


    //Your stuff here for file Click
    public void OnFileClicked(File file) {
        // TODO Auto-generated method stub
        new AlertDialog.Builder(this)
        .setIcon(R.drawable.icon)
        .setTitle("[" + file.getName() + "]")
        .setPositiveButton("OK",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog,
                            int which) {


                    }

                }).show();
    }

}

Gerekli kitaplıkları içe aktarın. Umarım bunlar size yardımcı olur ...


benim için işi yapan çok teşekkür ederim, sadece gereksiz şişkinlik olmadan basit bir dosya keşfetme etkinliği
Mike76


3

Karışıma ek olarak: OI Dosya Yöneticisinin openintents.org'da kayıtlı genel bir api'si vardır.

http://www.openintents.org/filemanager

http://www.openintents.org/action/org-openintents-action-pick-file/


Yukarıdaki bağlantı artık çalışmıyor.
uaaquarius

Evet biliyorum. Openintents.org'u her kim idare ediyorsa, çökmesine izin verdi.
Edward Falk

Yeni bağlantıyı bulan Juozas Kontvainis'e teşekkürler.
Edward Falk

Ayrıca: kayıtlı amaçları araştırmanın, hatta bunlara göz atmanın bir yolu var mı?
Edward Falk

2

Samsung Dosya Seçici İletişim Kutusunu uyguladım, aynı iletişim kutusunda dosya açma, kaydetme, dosya uzantısı filtresi oluşturma ve yeni dizin oluşturma yeteneği sağlar. Denemeye değer olduğunu düşünüyorum İşte Samsung geliştirici sitesinde oturum açmanız gereken Bağlantı çözümü görüntüle

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.