Androidには、アプリのデータを保存する機能の1つとして、
preference(プレファレンス)という機能があります。
今回は、そのpreferenceを使用して設定画面を作成していきましょう。
preference機能は、xmlファイルに設定情報を保持するため、
sqlite(データベース)を必要としないため、簡単に実装することができます。
まず、PreferenceFragmentを継承したクラスを作成します。
package com.example.simplepreference; import android.os.Bundle; import android.preference.PreferenceFragment; /** * PreferenceFragmentを継承したクラス * 個々で定義したPreferenceのリソースを設定します */ public class SimplePreferenceFragment extends PreferenceFragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.preference); } }
15行目で読み込む「R.xml.preference」は、
resフォルダ配下にxmlフォルダを新規に作成し、
preference.xmlという名前のファイルを新規に作成します。
このpreference.xmlには、設定画面の内容を定義していきます。
今回はチェックボックスを2つ置いていきます。
内容は以下の通りです。
<?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <PreferenceCategory android:title="@string/preference_title"> <CheckBoxPreference android:key="checkbox_01_key" android:title="@string/checkbox_01_title" android:summary="@string/checkbox_01_summary" /> <CheckBoxPreference android:key="checkbox_02_key" android:title="@string/checkbox_02_title" android:summary="@string/checkbox_02_summary" /> </PreferenceCategory> </PreferenceScreen>
res/string.xmlに、ここで設定するタイトルやサマリーに表示する文章を定義していきます。
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">SimplePreference</string> <string name="hello_world">Hello world!</string> <string name="action_settings">Settings</string> <!-- menu used --> <string name="opt_menu_01">My設定</string> <string name="opt_menu_02">ヘルプ</string> <!-- preference strings --> <string name="preference_title">simple設定画面</string> <string name="checkbox_01_title">ネットワーク通信許可</string> <string name="checkbox_01_summary">ネットワーク通信を有効にします</string> <string name="checkbox_02_title">GPS許可</string> <string name="checkbox_02_summary">GPSを有効にします</string> </resources>
続いて、設定画面表示用のActivityを作成します。
package com.example.simplepreference; import android.os.Bundle; import android.preference.PreferenceActivity; public class SimplePreferenceActivity extends PreferenceActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getFragmentManager().beginTransaction() .replace(android.R.id.content, new SimplePreferenceFragment()).commit(); } }
先ほど作成したSimplePreferenceFragmentのインスタンスを
Activity管理下のFragmentManagerに渡します。(7~8行目)
これで設定画面の出来上がりです。
それでは、メインのActivityから、このSimplePreferenceActivityを呼び出してみましょう。
今回はメニューから呼び出してみます。
package com.example.simplepreference; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.optionsMenu_01: Intent intent1 = new android.content.Intent(this, SimplePreferenceActivity.class); startActivity(intent1); return true; case R.id.optionsMenu_02: return true; default: return super.onOptionsItemSelected(item); } } }
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/optionsMenu_01" android:title="@string/opt_menu_01" android:icon="@android:drawable/ic_menu_preferences" /> <item android:id="@+id/optionsMenu_02" android:title="@string/opt_menu_02" android:icon="@android:drawable/ic_menu_edit" /> </menu>
メニューの設定をクリックした時に、
設定画面用のActivityを呼び出すようにしてみました。(26~29行目)
それでは、実行してみます。
右上のメニューをクリックします。
My設定をクリックします。
先ほど作成したチェックボックスが無事、表示されました。
チェックボックスにチェックをした後に、一度アプリを終了させ
再度、起動後に設定画面を開くと、チェック状態が保持されいると思います。
preferencesに設定されている情報は、以下のように簡単に取得が可能です。
preference.xmlで定義したキー情報を元に取得します。
SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this); Boolean bool = pref.getBoolean("checkbox_01_key",true);
【補足】
Android API Level 10までは、PreferenceActivityを継承したクラスを使用する方法が一般的でしたが、
Android API Level 11以降は、このPreferenceFragmentを継承したクラスを使用することが推奨されいます。
Android API Level 11以降で、PreferenceActivityを継承して実装した場合、
addPreferencesFromResourceメソッドで非推奨の警告が出ます。
コメント