DialogPreferenceをカスタマイズする
アプリ説明
- メイン画面でメニューを押す
- PreferenceActivityが起動
- メニュー1を選択
- カスタムDialogPreferenceが起動する
- ごにょごにょと
構成
- Activity
- 起動画面:SampleDialogPreference
- 設定画面:SettingActivity
- DialogPreference
- カスタムDialogPreference:SimpleDialogPreference
- リソース
作成手順
プロジェクト作成
- SampleDialogPreferenceという名前でプロジェクトを作成
設定画面の追加
- PreferenceActivityの追加
- Name : SettingActivity
- Superclass : PreferenceActivity
- ManifestファイルにSettingActivityを追加
<activity android:name=".SettingActivity" android:label="@string/app_name"> </activity>
起動画面のリソース作成
- menu作成
- res以下にmenuフォルダ作成
- menuフォルダにmenu.xml作成
- 以下の内容を記述
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:title="Menu1" android:id="@+id/item01" android:numericShortcut="1"> </item> </menu>
起動画面の処理を実装
- SampleDialogPreferenceにメニュー処理追加
- onCreateOptionsMenuをオーバライド
- 以下の内容を記述
@Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menu, menu); return true; }
-
- onOptionsItemSelectedをオーバライド
- 以下の内容を記述
@Override public boolean onOptionsItemSelected(MenuItem item) { Intent intent = new Intent(SampleDialogPreference.this, SettingActivity.class); startActivity(intent); return super.onOptionsItemSelected(item); }
DialogPreferenceのカスタマイズ
package com.example.dilogpref; import android.content.Context; import android.preference.DialogPreference; import android.util.AttributeSet; public class SimpleDialogPreference extends DialogPreference { public SimpleDialogPreference(Context context, AttributeSet attrs) { super(context, attrs); } public SimpleDialogPreference(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } }
設定画面のリソース作成
<?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <com.example.dilogpref.SimpleDialogPreference android:key="simplevalue" android:title="SimpleDialogPreference" android:summary="SimpleDialogPreference no summary"> </com.example.dilogpref.SimpleDialogPreference> </PreferenceScreen>
設定画面(SettingActivity)の処理実装
- onCreateをオーバライド
- 以下の内容を記述
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.setting); }
SimpleDialogPreferenceに処理実装
- onCreateDialogViewをオーバライド
- onCreateDialogViewメソッドでDialogに表示するViewを作成する。
- EditTxtの追加
- EditTextに保存された値を設定する。(最初は何も設定されていないのでnull)
- getPersistedString(String dfaultValue) 保存されたデータを取得。引数は初期値
- getKey() プリファレンスのキーを取得する
- 以下の内容を記述
@Override protected View onCreateDialogView() { this.edit = new EditText(this.getContext()); this.edit.setText(getPersistedString("default")); return this.edit; }
- Dialogを閉じたときの処理を追加
- onDialogClosedのオーバライド
- OKを選択した場合は、プリファレンスに値を保存する。キャンセルの時は何もしない
- persistStringを使うと勝手に保存してくれる
- 以下のように記述
@Override protected void onDialogClosed(boolean positiveResult) { if(positiveResult){ persistString(this.edit.getText().toString()); } super.onDialogClosed(positiveResult); }
ソース
SampleDialogPreference
package com.example.dilogpref; 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 SampleDialogPreference 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) { Intent intent = new Intent(SampleDialogPreference.this, SettingActivity.class); startActivity(intent); return super.onOptionsItemSelected(item); } }
SettingActivity
package com.example.dilogpref; import android.os.Bundle; import android.preference.PreferenceActivity; public class SettingActivity extends PreferenceActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.setting); } }
SimpleDialogPreference
package com.example.dilogpref; import android.content.Context; import android.preference.DialogPreference; import android.util.AttributeSet; import android.view.View; import android.widget.EditText; public class SimpleDialogPreference extends DialogPreference { EditText edit; public SimpleDialogPreference(Context context, AttributeSet attrs) { super(context, attrs); } public SimpleDialogPreference(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override protected View onCreateDialogView() { this.edit = new EditText(this.getContext()); this.edit.setText(getPersistedString("default")); return this.edit; } @Override protected void onDialogClosed(boolean positiveResult) { if(positiveResult){ persistString(this.edit.getText().toString()); } super.onDialogClosed(positiveResult); } }
menu.xml
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:title="Menu1" android:id="@+id/item01" android:numericShortcut="1"> </item> </menu>
setting.xml
<?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <com.example.dilogpref.SimpleDialogPreference android:key="simplevalue" android:title="SimpleDialogPreference" android:summary="SimpleDialogPreference no summary"> </com.example.dilogpref.SimpleDialogPreference> </PreferenceScreen>