「Androidでファイル選択ダイアログを使う Part2」にて少しバージョンアップしたコードを紹介してます。(2011/6/16追記)
どうやら標準ではWindowsのような選択ダイアログは無いようです。
なので、AlertDialogを転用して再現します。
ディレクトリを選択するとその中を表示して目的のファイルを選択できます。
こちらを参考にさせていただきました。
橋本詳細さん - [Android][Java]AlertDialogでファイル一覧から選択させて開く
内容の解説はリンク先にお任せして簡単にクラスの使い方サンプルコードを紹介しますのでがんばってください!(笑
スクリーンショット
→
クラス名 : FileListDialog
ダウンロード : FileListDialog.zip
このクラスを使ったプリファレンスを作成しました。こちらです。(2010/9/12追記)
ソースは「GoogleCode relog」にも保存していますのでよろしければどうぞ。 が、こちらは最新になっていて構成が変わっています。 zipになっているものから進化していますがご了承ください。
どうやら標準ではWindowsのような選択ダイアログは無いようです。
なので、AlertDialogを転用して再現します。
ディレクトリを選択するとその中を表示して目的のファイルを選択できます。
こちらを参考にさせていただきました。
橋本詳細さん - [Android][Java]AlertDialogでファイル一覧から選択させて開く
内容の解説はリンク先にお任せして簡単にクラスの使い方サンプルコードを紹介しますのでがんばってください!(笑
スクリーンショット
クラス名 : FileListDialog
ダウンロード : FileListDialog.zip
このクラスを使ったプリファレンスを作成しました。こちらです。(2010/9/12追記)
ソースは「GoogleCode relog」にも保存していますのでよろしければどうぞ。 が、こちらは最新になっていて構成が変わっています。 zipになっているものから進化していますがご了承ください。
呼び出し
選択時のイベントハンドラ
インターフェース「onFileListDialogListener」をFileListDialogクラスが持ってますのでimplementしておいてください。
これがないと結果を取得できません。
クラス本体
Javaの作法やらAndroidの作法やらを無視している可能性があるので注意ですが、そのあたりはご了承の上参考程度に使ってください。
<Category : Java(Android)>
//どこかの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の作法やらを無視している可能性があるので注意ですが、そのあたりはご了承の上参考程度に使ってください。


コメント (6)
とても素晴らしいです!
使わせて頂きます。
投稿者: take | 2010年09月08日 03:36
日時: 2010年09月08日 03:36
>takeさん
ありがとうございます。
がんがん使ってやってください。
投稿者: あやね | 2010年09月09日 00:49
日時: 2010年09月09日 00:49
こういったものが必要でした!!
ありがたく,使わせていただきます.
投稿者: yoshi_na | 2011年06月16日 18:28
日時: 2011年06月16日 18:28
FileListDialog.zipが404 NotFoundエラー吐かれてダウンロードできません。
またGoogleCode relogにも同じエラーが吐かれています。
修正お願いします
投稿者: nanashi | 2012年03月17日 17:51
日時: 2012年03月17日 17:51
>nanashi さん
指摘ありがとうございます。
修正しました。
投稿者: あやね | 2012年03月26日 19:26
日時: 2012年03月26日 19:26
エラーで動きませんね
dlg.setOnFileListDialogListener((onFileListDialogListener) this);
※ここでエラー発生
他の人は動いてるのかな?
投稿者: 恵那 | 2012年12月14日 09:26
日時: 2012年12月14日 09:26