Androidでファイル選択用プリファレンスを使う

Androidの設定画面はPreferencesという機能を作ると非常に簡単に作れて便利なのですが、種類が少ないのがたまに傷ってやつです。
なので、ファイル選択用のPreferenceを作ってみました。

以下のサイトさんを参考に作りました。
HASELABさんのEditTextPreferenceの数値入力に拡張


どんな感じかってのは以下のSSの通りです。



最終的にサマリーに選択したパスが反映されてSharedPreferenceに保存されます。





使い方は、xmlに以下の感じで追加します。
パッケージ名は各自調節してください。
<jp.xii.relog.setting.FileSelectPreference
		android:id="@+id/FileSelect"
		android:key="FileSelect"
		android:title="ファイル選択"
		>
</jp.xii.relog.setting.FileSelectPreference>


具体的なクラスは、「DialogPreference」クラスを継承して作成するのと、以前作成した「Androidでファイル選択ダイアログを使う」の「FileListDialog」クラスを使用します。

package jp.xii.relog.setting;

import java.io.File;
import android.content.Context;
import android.content.SharedPreferences;
import android.preference.DialogPreference;
import android.util.AttributeSet;
import android.view.View;
import android.widget.Toast;
import jp.xii.relog.setting.FileListDialog;
import jp.xii.relog.setting.FileListDialog.onFileListDialogListener;


/**
 * ファイルリストプリファレンス
 * @author Iori
 *
 * 拡張パラメータ
 * rootPath : 表示開始するパス(フルパス)
 */
public class FileSelectPreference extends DialogPreference
	implements FileListDialog.onFileListDialogListener{

	private String _rootPath = "/";			//ルートパス
	private String _defaultPath = "";		//ファイルリストで選択したパス
	
	/**
	 * コンストラクタ
	 * @param context
	 * @param attrs
	 */
	public FileSelectPreference(Context context, AttributeSet attrs) {
		super(context, attrs);
		
		//デフォルトバリュー取得
		String default_value = attrs.getAttributeValue(null, "defaultValue");
		if(default_value == null){
			_defaultPath = "/";
		}else{
			_defaultPath = default_value;
		}
	}

	/**
	 * 表示したときに呼ばれる
	 */
	@Override
	protected void onBindView(View view) {
		//設定を読み込み
		SharedPreferences pref = getSharedPreferences();
		if(pref == null){
		}else{
			_defaultPath = pref.getString(getKey(),  _defaultPath);
		}

		//サマリーに現在値を設定
		setSummary((CharSequence) _defaultPath);

		//これはなぜか最後じゃないとイケないらしい
		super.onBindView(view);
	}

	/**
	 * プリファレンスのクリックイベント
	 */
	@Override
	protected void onClick(){
		//どこかのonClickででもこんな呼び出しをする
		FileListDialog dlg = new FileListDialog(getContext());
		//リスナーの登録
		dlg.setOnFileListDialogListener((onFileListDialogListener) this);
		//ディレクトリを選択するか
		//dlg.setDirectorySelect(true);
		//表示(とりあえずルートから)
		dlg.show( _rootPath, _rootPath);
		
	}


	/**
	 * ファイルの選択結果のイベント
	 */
	@Override
	public void onClickFileList(File file) {
		
		if(file == null){
			Toast.makeText(getContext(), "ファイルの取得ができませんでした", Toast.LENGTH_SHORT).show();
		}else{
			//確認ダイアログ表示
			setDialogTitle((CharSequence)"確認");
			setDialogMessage((CharSequence) file.getAbsolutePath());
			showDialog(null);
		}
	}
	

	/**
	 * 確認ダイアログが閉じた時のイベント
	 */
	@Override
	protected void onDialogClosed(boolean positiveResult) {
		super.onDialogClosed(positiveResult);
		
		if(!positiveResult){
		}else{
			//設定を保存
			SharedPreferences.Editor editor = getEditor();
			editor.putString(getKey(), (String) getDialogMessage());
			editor.commit();

			//サマリーを更新
			notifyChanged();
		}
	}
	
}

サンプルダウンロードFileSelectPreference(FileListDialog.java同梱)

みなさんの参考になればと思います。