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メソッドで非推奨の警告が出ます。





コメント