Androidの設定画面はPreferencesという機能を作ると非常に簡単に作れて便利なのですが、種類が少ないのがたまに傷ってやつです。
なので、ファイル選択用のPreferenceを作ってみました。
以下のサイトさんを参考に作りました。
HASELABさんのEditTextPreferenceの数値入力に拡張
どんな感じかってのは以下のSSの通りです。
最終的にサマリーに選択したパスが反映されてSharedPreferenceに保存されます。
なので、ファイル選択用のPreferenceを作ってみました。
以下のサイトさんを参考に作りました。
HASELABさんのEditTextPreferenceの数値入力に拡張
どんな感じかってのは以下のSSの通りです。
最終的にサマリーに選択したパスが反映されてSharedPreferenceに保存されます。
使い方は、xmlに以下の感じで追加します。
パッケージ名は各自調節してください。
具体的なクラスは、「DialogPreference」クラスを継承して作成するのと、以前作成した「Androidでファイル選択ダイアログを使う」の「FileListDialog」クラスを使用します。
サンプルダウンロード : FileSelectPreference(FileListDialog.java同梱)
みなさんの参考になればと思います。
<Category : Java(Android)>
パッケージ名は各自調節してください。
<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同梱)
みなさんの参考になればと思います。


コメント (4)
Preferenceを調べててたどり着きました。
参考にさせていただきます。
ところで、FileSelectPreferenceクラスの
> @Override
>public void onClickFileList(File file) {
はインターフェイス実装なので
@Overrideはいらないのではないでしょうか?
実際、エラーが発生します。
自分の勘違いかな?まだ、Java始めたばかりなので、、、
投稿者: 通りすがりA | 2010年12月01日 15:53
日時: 2010年12月01日 15:53
すんません。
>@Overrideいらないのではないでしょうか?
JDK1.6で仕様変更なされたのですね、、、
サンプルで正しかったです。
調べてから書き込めって話ですよね。。。
勉強になりました、、、
投稿者: 通りすがりA | 2010年12月01日 17:08
日時: 2010年12月01日 17:08
>通りすがりA さん
参考になれば幸いでございますよ。
投稿者: あやね | 2010年12月01日 23:00
日時: 2010年12月01日 23:00
ファイル選択プリファレンス
すごいです。
参考にさせていただきます。
投稿者: ねずみっくす | 2011年12月14日 16:32
日時: 2011年12月14日 16:32