フォルダ選択ダイアログ
- Android
-
2011-12-13 - 更新:2013-06-12
この記事は最終更新日から1年以上経過しています。
アラートダイアログを使って、ファイル選択にも応用できる参照機能
こちらのサイトを参考にさせていただきました。
http://d.hatena.ne.jp/Silent-Bob/20110705
・ルートフォルダーを設定
指定したフォルダー階層より上に上がれないようにします。
private static final String ROOT_PATH =
Environment.getExternalStorageDirectory().getPath() + "/";
再帰的に利用するため、ダイアログ表示をメソッドとして定義
private void SelectDirectoryDialog(final Context context, final String parentPath) {
AlertDialog.Builder ad = new AlertDialog.Builder(context);
ad.setTitle(parentPath);
ad.setCancelable(false);
ad.setNegativeButton("キャンセル", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int whichButton) {
return;
}
});
try{
File[] files = new File(parentPath).listFiles();
ArrayList<String> pathList = new ArrayList<String>();
for (File file : files) {
if(file.isDirectory()){
//ディレクトリの場合
pathList.add(file.getName());
}
}
Collections.sort(pathList);//ソート
pathList.add(0, "このフォルダを選択する");
pathList.add(1, "一つ前に戻る");
//配列に変換
final String[] items = pathList.toArray(new String[0]);
ad.setItems(items, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch(which){
case 0:
TextView tv = (TextView)findViewById(R.id.textView1);
tv.setText(parentPath);
break;
case 1:
if(parentPath.equals(ROOT_PATH)){
Toast.makeText(context, "これ以上戻れません", Toast.LENGTH_SHORT).show();
SelectDirectoryDialog(context, parentPath);
}else{
//parentの一つ前のパスを取得
String grandparentPath = parentPath.substring(0, parentPath.length()-1);
grandparentPath = grandparentPath.substring(0, grandparentPath.lastIndexOf("/")+1);
SelectDirectoryDialog(context, grandparentPath);
}
break;
default:
SelectDirectoryDialog(context, parentPath + items[which] + "/");
break;
}
}
});
}catch(Exception e){
e.printStackTrace();
}
ad.create().show();
}
ファイルも選択できるようにしました。
private void SelectDirectoryDialog(final Context context, final String parentPath){
TextView tv;
AlertDialog.Builder ad = new AlertDialog.Builder(context);
ad.setTitle(parentPath);
ad.setCancelable(false);
ad.setNegativeButton("キャンセル", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int whichButton) {
return;
}
});
try{
//ファイル名のフィルターを作成
FilenameFilter fFilter = new FilenameFilter() {
@Override
public boolean accept(File dir, String filename) {
boolean f;
if(new File(dir + "/" + filename).isDirectory()) {
f = true;
} else if (filename.matches(".+.jpg")) { //正規表現で検索
f = true;
} else {
f = false;
}
return f;
}
};
File[] files = new File(parentPath).listFiles(fFilter);
ArrayList<String> pathList = new ArrayList<String>();
for (File file : files) {
pathList.add(file.getName());
}
Collections.sort(pathList);//ソート
pathList.add(0, "このフォルダを選択する");
pathList.add(1, "一つ前に戻る");
//配列に変換
final String[] items = pathList.toArray(new String[0]);
ad.setItems(items, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch(which){
case 0:
tv = (TextView)findViewById(R.id.textView1);
tv.setText(parentPath);
break;
case 1:
if(parentPath.equals(ROOT_PATH)){
Toast.makeText(context, "これ以上戻れません", Toast.LENGTH_SHORT).show();
SelectDirectoryDialog(context, parentPath);
}else{
//parentの一つ前のパスを取得
String grandparentPath = parentPath.substring(0, parentPath.length()-1);
grandparentPath = grandparentPath.substring(0, grandparentPath.lastIndexOf("/")+1);
SelectDirectoryDialog(context, grandparentPath);
}
break;
default:
File f = new File(parentPath + items[which]);
if(f.isFile()) {
tv = (TextView)findViewById(R.id.textView1);
tv.setText(parentPath + items[which]);
} else {
SelectDirectoryDialog(context, parentPath + items[which] + "/");
}
break;
}
}
});
}catch(Exception e){
e.printStackTrace();
}
ad.create().show();
}
この記事に対して、「Android(Java)初心者です。onOptionsItemSelectedからダイアログを表示するにはどのような記述が必要でしょうか?」という質問があったようなので追記しました。2013-06-12
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1081951280
使用例1)Activityを継承したpublicクラスのメソッド内で実行する場合
SelectDirectoryDialog(this, ROOT_PATH);
第2引数「parentPath」に最初に表示させたいフォルダーを指定します。
ここではルートフォルダーを指定しています。
使用例2)メニューを選択した場合に実行
public boolean onOptionsItemSelected(MenuItem item){
switch(item.getItemId()){
case R.id.item01:
SelectDirectoryDialog(this, ROOT_PATH);
return true;
default:
return super.onOptionsItemSelected(item);
}
}
メニューについてはこちらに書いています。
[メニューを設定する]
FilenameFilterについてはこちら
[FilenameFilter]
この記事がお役に立ちましたらシェアお願いします
10,882 views




