preferenceを使って設定画面を作成してみる

preference(設定画面)

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という名前のファイルを新規に作成します。

simple-pref-01

この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行目)

それでは、実行してみます。

simple-pref-02

右上のメニューをクリックします。

simple-pref-03

My設定をクリックします。

simple-pref-04

先ほど作成したチェックボックスが無事、表示されました。

チェックボックスにチェックをした後に、一度アプリを終了させ
再度、起動後に設定画面を開くと、チェック状態が保持されいると思います。

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

コメント

  1. そら より:

    はじめまして。今androidのアプリ開発を勉強しているものです。

    大変参考にさせていただいています。
    その中で、「preferenceを使って設定画面を作成してみる」ページを実践してみているのですが、
    機種が異なるためか、、バージョンなのか、、、わかりませんが、画面のように「・・・」が
    出てこないで、下の方からメニューが出てくる状態になっています。これは設定の違いですか?

    あと、preference.xmlの名前は変更したうえで、
    addPreferencesFromResource(R.xml.preference);
    の部分を書き換えています。

    ですが、このメニューを押下すると、ページが無いのか、見つからないのか、アプリが停止してしまうのです。
    変えているのは、このxmlだけのはずなのですが、
    ページ切り替えがうまくいかず悩んでいます。

    どうかご教授よろしくお願いします。

    • yocchin より:

      はじめまして。コメントありがとうございます。
      ご連絡遅れてしまい、申し訳ございません。

      preference画面が表示できないということですが、
      たしかにAndroidのAPIのバージョンによっては、
      記事中で使用している「PreferenceFragment 」が使用できません。

      「PreferenceFragment 」を継承したActivityクラスにてご説明していますが、
      古いバージョンの場合、「PreferenceActivity 」を継承します。

      メニュー押下時、エラーログのようなものは出力されていますでしょうか。
      開発しているAndroidのバージョン、実行時のエラーログ、ソースコードなどがあれば
      もう少し的確なアドバイスができると思います。

  2. そら より:

    いろいろ見ていたら動き出しました。
    string.xmlかmain.xmlに足りない設定があったため、
    追記をしたら動き出しました。

    ありがとうございました。

タイトルとURLをコピーしました