どうやら標準ではWindowsのような選択ダイアログは無いようです。
なので、AlertDialogを転用して再現します。
ディレクトリを選択するとその中を表示して目的のファイルを選択できます。
こちらを参考にさせていただきました。
橋本詳細さん - [Android][Java]AlertDialogでファイル一覧から選択させて開く
内容の解説はリンク先にお任せして簡単にクラスの使い方サンプルコードを紹介しますのでがんばってください!(笑
スクリーンショット
クラス名 : FileListDialog
ダウンロード : FileListDialog.zip
このクラスを使ったプリファレンスを作成しました。こちらです。(2010/9/12追記)
ソースは「GoogleCode relog」にも保存していますのでよろしければどうぞ。 が、こちらは最新になっていて構成が変わっています。 zipになっているものから進化していますがご了承ください。
呼び出し
//どこかのonClickででもこんな呼び出しをする FileListDialog dlg = new FileListDialog(this); //リスナーの登録 dlg.setOnFileListDialogListener((onFileListDialogListener) this); //ディレクトリを選択するか //dlg.setDirectorySelect(true); //表示(とりあえずルートから) dlg.show( "/", "/");
選択時のイベントハンドラ
インターフェース「onFileListDialogListener」をFileListDialogクラスが持ってますのでimplementしておいてください。
これがないと結果を取得できません。
/**
* ファイルリスト選択ハンドル
*/
@Override
public void onClickFileList(File file) {
if(file == null){
Toast.makeText(this, "ファイルの取得ができませんでした", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(this, file.getName(), Toast.LENGTH_SHORT).show();
}
}
クラス本体
package jp.xii.relog.setting;
import java.io.File;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.view.*;
/**
* ファイルリストダイアログクラス
* @author Iori
*
*/
public class FileListDialog extends Activity
implements View.OnClickListener
, DialogInterface.OnClickListener
{
private Context _parent = null; //親
private File[] _dialog_file_list; //今、表示しているファイルのリスト
private int _select_count = -1; //選択したインデックス
private onFileListDialogListener _listener = null; //リスナー
private boolean _is_directory_select = false; //ディレクトリ選択をするか?
/**
* ディレクトリ選択をするか?
* @param is
*/
public void setDirectorySelect(boolean is){
_is_directory_select = is;
}
public boolean isDirectorySelect(){
return _is_directory_select;
}
/**
* 選択されたファイル名取得
* @return
*/
public String getSelectedFileName(){
String ret = "";
if(_select_count < 0){
}else{
ret = _dialog_file_list[_select_count].getName();
}
return ret;
}
/**
* ファイル選択ダイアログ
* @param context 親
*/
public FileListDialog(Context context){
_parent = context;
}
@Override
public void onClick(View v) {
// 処理なし
}
/**
* ダイアログの選択イベント
*/
@Override
public void onClick(DialogInterface dialog, int which) {
//選択されたので位置を保存
_select_count = which;
if((_dialog_file_list == null) || (_listener == null)){
}else{
File file = _dialog_file_list[which];
// Util.outputDebugLog("getAbsolutePath : " + file.getAbsolutePath());
// Util.outputDebugLog("getPath : " + file.getPath());
// Util.outputDebugLog("getName : " + file.getName());
// Util.outputDebugLog("getParent : " + file.getParent());
if(file.isDirectory() && !isDirectorySelect()){
//選択した項目がディレクトリで、ディレクトリ選択しない場合はもう一度リスト表示
show(file.getAbsolutePath(), file.getPath());
}else{
//それ以外は終了なので親のハンドラ呼び出す
_listener.onClickFileList(file);
}
}
}
/**
* ダイアログ表示
* @param context 親
* @param path 表示したいディレクトリ
* @param title ダイアログのタイトル
*/
public void show(String path, String title){
try{
_dialog_file_list = new File(path).listFiles();
if(_dialog_file_list == null){
//NG
if(_listener != null){
//リスナーが登録されてたら空で呼び出す
_listener.onClickFileList(null);
}
}else{
String[] list = new String[_dialog_file_list.length];
int count = 0;
String name = "";
//ファイル名のリストを作る
for (File file : _dialog_file_list) {
if(file.isDirectory()){
//ディレクトリの場合
name = file.getName() + "/";
}else{
//通常のファイル
name = file.getName();
}
list[count] = name;
count++;
}
//ダイアログ表示
new AlertDialog.Builder(_parent).setTitle(title).setItems(list, this).show();
}
}catch(SecurityException se){
//Util.outputDebugLog(se.getMessage());
}catch(Exception e){
//Util.outputDebugLog(e.getMessage());
}
}
/**
* リスナーのセット
* @param listener
*/
public void setOnFileListDialogListener(onFileListDialogListener listener){
_listener = listener;
}
/**
* クリックイベントのインターフェースクラス
* @author Iori
*
*/
public interface onFileListDialogListener{
public void onClickFileList(File file);
}
}
Javaの作法やらAndroidの作法やらを無視している可能性があるので注意ですが、そのあたりはご了承の上参考程度に使ってください。
take
とても素晴らしいです!
使わせて頂きます。
あやね
>takeさん
ありがとうございます。
がんがん使ってやってください。
yoshi_na
こういったものが必要でした!!
ありがたく,使わせていただきます.
nanashi
FileListDialog.zipが404 NotFoundエラー吐かれてダウンロードできません。
またGoogleCode relogにも同じエラーが吐かれています。
修正お願いします
あやね
>nanashi さん
指摘ありがとうございます。
修正しました。
恵那
エラーで動きませんね
dlg.setOnFileListDialogListener((onFileListDialogListener) this);
※ここでエラー発生
他の人は動いてるのかな?
大和
ありがとうございます。
LapTimeGPXというアプリで使わせて貰っています。
今回、android7.0にバージョンアップしたNexus6で使ってみたらダイアログが開きません。
andrid studioのエミュレータでもandroid6.0までは正常、7.0では駄目です。
当方側も問題かもしれませんが心当たりがありましたら教えて下さい。
IoriAYANEから大和への返信
>大和さん
活用していただいていたようで、とても嬉しいです。
残念ながら、お答えできるような情報はありません。
Androidのアプリは久しく開発していないので、最近の事情はわかりません。
何かAndroid側に変更があったのかもしれません。
大和
あやねさん
早速の返信をありがとうございます。
当方で少し調べてみます。
大和から大和への返信
下記を入れて解決しました。
rootPath= Environment.getExternalStorageDirectory().getPath();
maru
ありがとうございます。自作アプリで使わせていただいています。
しかし、フォルダの表示順がめちゃくちゃで気持ち悪いです。Windowsのように、上にディレクトリ、そのしたにファイルを、それぞれ名前順に並べて表示することは出来ませんか?