SQLの窓

2015年09月05日


ListView を使った AlertDialog で SD カード内のファイルのパスを取得する



以前から思っていたのですが、変数に日本語を使うと内容を説明しやすいので主な変数を全て日本語にして、かつ、クラス変数で参照が容易になるようにした上で、メソッドの処理を引数を使うのでは無く、この変数で処理を明示するようにしてみました。

主な特記事項

SD カードにアクセスする為に、AndroidManifest.xml には android.permission.READ_EXTERNAL_STORAGE または、android.permission.WRITE_EXTERNAL_STORAGE を uses-permission に設定する必要があります。

Environment.getExternalStorageState() で、SD カードが使用可能かどうかをチェックしています

この場合のダイアログは、ダイアログ内をクリックする毎に表示する内容や処理が変わります。固定部分は、Activity の onCreate で定義していますが、その他の部分は loadFileDialog(ユーザー作成のメソッド) 内で毎回設定してから、show メソッドで表示を行います。

ダイアログは、フラグメント(DialogFragment)では無いのでデバイスが回転するとリセットされます
package sample.lightbox.filedialog;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.widget.Toast;

import java.io.File;

public class MainActivity extends Activity {

	private String tag = null;
	private File SDカードディレクトリ = null;
	private File 現在のファイルオブジェクト = null;
	private String 現在のパス文字列 = null;
	private String[] フォルダとファイルの一覧 = null;
	private AlertDialog.Builder ファイルダイアログ = null;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		// リソースよりデータを取得する
		tag = getResources().getString(R.string.app_name);

		// SDカードのパスを取得( Environment クラス )
		String 外部ストレージの状態 = Environment.getExternalStorageState();
		if (外部ストレージの状態.equals(Environment.MEDIA_MOUNTED)) {
			SDカードディレクトリ = Environment.getExternalStorageDirectory();
			現在のパス文字列 = SDカードディレクトリ.getAbsolutePath();
			Log.i(tag, 現在のパス文字列);
		}

		// ファイルダイアログの固定部分の定義
		ファイルダイアログ = new AlertDialog.Builder(MainActivity.this);
		ファイルダイアログ
				.setPositiveButton("キャンセル", null)
				.setNegativeButton("親フォルダ", new DialogInterface.OnClickListener() {
					@Override
					public void onClick(DialogInterface dialog, int which) {
						if (現在のパス文字列.equals(SDカードディレクトリ.getAbsolutePath())) {
							// SDカードより上には移動しない
							return;
						}

						現在のファイルオブジェクト = 現在のファイルオブジェクト.getParentFile();
						現在のパス文字列 = 現在のファイルオブジェクト.getAbsolutePath();
						フォルダとファイルの一覧 = 現在のファイルオブジェクト.list();
						loadFileDialog();

					}
				});


		// ボタン(SDカード参照) のイベント
		MainActivity.this.findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				// ボタンクリックで表示する場合は、常に SDカードディレクトリから
				現在のファイルオブジェクト = SDカードディレクトリ;
				現在のパス文字列 = 現在のファイルオブジェクト.getAbsolutePath();
				フォルダとファイルの一覧 = 現在のファイルオブジェクト.list();
				loadFileDialog();

			}
		});
	}

	// ファイルダイアログの表示
	void loadFileDialog() {

		// ダイアログの作成と振る舞いの定義
		// ※ 注意 : フラグメントでは無いのでデバイスが回転するとリセットされます
		ファイルダイアログ
				.setTitle(現在のパス文字列)
				.setItems(フォルダとファイルの一覧, new DialogInterface.OnClickListener() {
					@Override
					public void onClick(DialogInterface dialog, int which) {
						// 選択したファイルのパスの作成
						StringBuffer 選択したファイルのパス = new StringBuffer(現在のパス文字列);
						選択したファイルのパス
								.append(File.separator)
								.append(フォルダとファイルの一覧[which]);
						File ワークファイルオブジェクト = new File(選択したファイルのパス.toString());

						if (ワークファイルオブジェクト.isFile()) {
							// ファイル名のみ の表示
							Toast.makeText(MainActivity.this, フォルダとファイルの一覧[which], Toast.LENGTH_SHORT).show();
						} else {
							現在のファイルオブジェクト = ワークファイルオブジェクト;
							現在のパス文字列 = 現在のファイルオブジェクト.getAbsolutePath();
							フォルダとファイルの一覧 = 現在のファイルオブジェクト.list();
							loadFileDialog();
						}
					}
				});

		ファイルダイアログ.show();
	}

}


画面定義
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="SDカード参照"
        android:id="@+id/button"
        android:layout_alignParentTop="true"
        android:layout_alignParentStart="true" />

</RelativeLayout>



【Android Studio 2の最新記事】
posted by lightbox at 2015-09-05 20:56 | Android Studio 2 | このブログの読者になる | 更新情報をチェックする
container 終わり



フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり