Android, SeekBarPreference で設定した値を保存する
Android で CheckBoxPreference
などを使って設定を行うと、リソースファイルの res/xml/settings.xml と PreferenceActivity
を継承したクラスの定義をして addPreferenceFromResource
メソッドで settings.xml の読み込みを行う程度で、簡単に設定の読み出し・保存ができる。
ところが、SeekBarPreference
を使って設定をしてみようとするとシークバーのダイアログが表示されるが、設定の読み出し・保存はできなかった。
SeekBarPreference
を使うには、設定の保存・読み出し処理を自分で書かなければいけないらしい。
以下は、Android のメニューボタンを押してメニューから設定画面を表示させ、シークバーダイアログを使って設定の読み出し・保存を行うコード。
res/layout/main.xml (メイン画面のレイアウト)
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_gravity="center" android:padding="25dip"> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/about_seekbarsample" /> </LinearLayout>
res/menu/menu.xml (メニュー)
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/settings" android:title="@string/settings_label" /> </menu>
res/xml/settings.xml (設定のリソースファイル)
res/ws/serendip/seekbarsample/SeekBarPreference.java で定義した SeekBarPreference
を使うために、ws.serendip.seekbarsample.SeekBarPreference
と記述している。
<?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <ws.serendip.seekbarsample.SeekBarPreference android:id="@+id/seekbar" android:key="seekbar" android:title="@string/seekbar_title" android:summary="@string/seekbar_summary" /> </PreferenceScreen>
res/values/strings.xml (文字列のリソースファイル)
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="about_seekbarsample">This is SeekBarSample!\n\nClick menu button, to open SeekBar sample.</string> <string name="app_name">SeekBarSample</string> <string name="settings_label">Settings ...</string> <string name="settings_title">SeekBarSample settings</string> <string name="seekbar_title">SeekBar Setting</string> <string name="seekbar_summary">Settings by SeekBar.</string> </resources>
src/ws/serendip/seekbarsample/SeekBarSample.java (アプリのメインコード)
メニューの作成とメニュー選択時の処理を行っている。
package ws.serendip.seekbarsample; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; public class SeekBarSample extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menu, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.settings: startActivity(new Intent(this, Settings.class)); return true; } return false; } }
src/ws/serendip/seekbarsample/Settings.java (設定 Activity のコード)
Activity 生成時の設定の読み込み処理を行う。
package ws.serendip.seekbarsample; import android.os.Bundle; import android.preference.PreferenceActivity; public class Settings extends PreferenceActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.settings); } }
src/ws/serendip/seekbarsample/SeekBarPreference.java (SeekBarPreference のコード)
シークバーダイアログの生成処理や『OK』ボタンをクリックした際の設定保存処理などを行う。
シークバー操作時の処理は記述していないが、android.util.Log
を使うと、LogCat で変化する値を確認することができる。
package ws.serendip.seekbarsample; import android.content.Context; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.preference.DialogPreference; import android.preference.PreferenceManager; import android.util.AttributeSet; import android.view.View; import android.view.ViewGroup.LayoutParams; import android.widget.LinearLayout; import android.widget.SeekBar; public class SeekBarPreference extends DialogPreference implements SeekBar.OnSeekBarChangeListener { private SeekBar bar; private Context mContext; private static SharedPreferences sp; private static final String OPT_SEEKBAR_KEY = "seekbar"; private static final int OPT_SEEKBAR_DEF = 30; private static final int LAYOUT_PADDING = 10; public SeekBarPreference(Context context, AttributeSet attrs) { super(context, attrs); mContext = context; sp = PreferenceManager.getDefaultSharedPreferences(context); } public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { // TODO Auto-generated method stub } public void onStartTrackingTouch(SeekBar seekBar) { // TODO Auto-generated method stub } public void onStopTrackingTouch(SeekBar seekBar) { // TODO Auto-generated method stub } @Override protected View onCreateDialogView() { LinearLayout layout = new LinearLayout(mContext); layout.setPadding(LAYOUT_PADDING, LAYOUT_PADDING, LAYOUT_PADDING, LAYOUT_PADDING); bar = new SeekBar(mContext); bar.setOnSeekBarChangeListener(this); bar.setProgress(getValue()); layout.addView(bar, new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); return layout; } @Override protected void onBindDialogView(View v) { super.onBindDialogView(v); } @Override protected void onDialogClosed(boolean positiveResult) { if (positiveResult) { setValue(bar.getProgress()); } } private void setValue(int value) { Editor ed = sp.edit(); ed.putInt(OPT_SEEKBAR_KEY, value); ed.commit(); } private int getValue() { return sp.getInt(OPT_SEEKBAR_KEY, OPT_SEEKBAR_DEF); } }
忘れずに、AndroidManifest.xml に Settings
の activity
を追加しておく。
<activity android:name=".Settings" android:label="@string/settings_title"> </activity>
以上のコードで SeekBarPreference
を使って設定の読み出し・保存が可能となる。
参考:诗意代码 – PoemCode » 设计自己的Android Preference
Android(開発)/ちょっとした設定の永続化 – 俺の基地
シークバー(SeekBar)を使用するには – 逆引きAndroid入門
オライリージャパン
売り上げランキング: 35045