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