■設定画面
SettingActivity.java
以下のようにしてActivityを定義する。
package info.justoneplanet.android.sample.preference; import android.os.Bundle; import android.preference.Preference; import android.preference.Preference.OnPreferenceChangeListener; import android.preference.PreferenceActivity; import android.util.Log; public class SettingActivity extends PreferenceActivity implements OnPreferenceChangeListener { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.setting); } /** * 設定が変更された時 */ @Override public boolean onPreferenceChange(Preference preference, Object newValue) { Log.e("preference changed - " + preference.toString(), newValue.toString()); return false; } }
驚くことに保存するロジックは書かなくて良い。以下のXMLを定義すればkeyを元にして自動的に保存される。
res/xml/setting.xml
<?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <PreferenceCategory android:title="@string/group1"> <CheckBoxPreference android:key="@string/item1_key" android:title="@string/item1" android:summary="@string/item1_summary" android:summaryOn="@string/item1_summary_on" android:summaryOff="@string/item1_summary_off" android:defaultValue="true" /> </PreferenceCategory> <PreferenceCategory android:title="@string/group1"> <ListPreference android:key="@string/item2_key" android:title="@string/item2" android:summary="@string/item2_summary" android:dialogTitle="@string/item2" android:entries="@array/list_entries" android:entryValues="@array/list_entryvalues" android:selectable="true" android:enabled="true" android:positiveButtonText="OK" android:negativeButtonText="Cancel" android:defaultValue="2nd"> </ListPreference> <RingtonePreference android:key="@string/melody_key" android:title="@string/melody" android:summary="@string/melody_summary" android:showDefault="true" /> </PreferenceCategory> </PreferenceScreen>
■設定呼び出し画面
以下のようにして通常のSharedPreferenceから読み出しできる。PreferenceManager.getDefaultSharedPreferences(this);だけが設定画面用の呼び出しである。
package info.justoneplanet.android.sample.preference; import android.app.Activity; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.preference.PreferenceManager; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.widget.TextView; public class MainActivity extends Activity { private static final int REQUEST_CODE = 200; private SharedPreferences sharedPreferences; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // sharedpreferenceの呼び出し sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); } @Override public void onResume() { super.onResume(); // 設定から戻ってきたときに反映されているように // 設定1 TextView textView1 = (TextView) findViewById(R.id.item1); textView1.setText(String.valueOf(sharedPreferences.getBoolean(getString(R.string.item1_key), true))); // 設定2 TextView textView2 = (TextView) findViewById(R.id.item2); textView2.setText(String.valueOf(sharedPreferences.getString(getString(R.string.item2_key), getString(R.string.not_set)))); // 設定3 TextView textView3 = (TextView) findViewById(R.id.item3); textView3.setText(String.valueOf(sharedPreferences.getString(getString(R.string.melody_key), getString(R.string.not_set)))); } /** * メニューボタンが押された時 */ @Override public boolean onCreateOptionsMenu(Menu menu) { boolean result = super.onCreateOptionsMenu(menu); MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.main, menu); return result; } /** * メニューが選択された時 */ @Override public boolean onOptionsItemSelected(MenuItem item) { switch(item.getItemId()){ case R.id.menu_setting: Intent intent = new Intent(this, SettingActivity.class); startActivityForResult(intent, REQUEST_CODE); return true; } return false; } }
ロジックには関係しないが後でコピーする為にリソースも残しておく。
res/values/strings.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">Preference</string> <string name="menu_setting">Setting</string> <string name="not_set">Not set, yet.</string> <string name="group1">group 1</string> <string name="item1">item 1</string> <string name="item1_key">item1</string> <string name="item1_summary_on">it is on</string> <string name="item1_summary_off">it is off</string> <string name="item1_summary">summary1</string> <string name="group2">group 2</string> <string name="item2">item 2</string> <string name="item2_key">item2</string> <string name="item2_summary">summary1</string> <string name="melody">melody</string> <string name="melody_key">melody</string> <string name="melody_summary">melody</string> </resources>
res/values/array.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="list_entries"> <item>Item 1</item> <item>Item 2</item> <item>Item 3</item> </string-array> <string-array name="list_entryvalues"> <item>1</item> <item>2</item> <item>3</item> </string-array> </resources>
ちなみに属性値を誤って入力しなかったりするとR.javaが崩れる。
res/layout/main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/app_name" /> <TextView android:id="@+id/item1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/app_name" /> <TextView android:id="@+id/item2" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/app_name" /> <TextView android:id="@+id/item3" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/app_name" /> </LinearLayout>