設定値を簡単に保存するプリファレンスの使い方

アプリケーションを実行するためには、たいていの場合、何かを設定します。

その設定は必要なものであったり、あるいは、好みに応じて任意に設定したり・・・

いずれにせよ、ちょっとした値をユーザーから集めたい場合はよくあることです。

Android ではそれを保存しておく場所として、プリファレンス (Preference) という仕組みが使えます。

ここではそのプリファレンスを利用する、もっとも基本的な方法を見ていきます。

プリファレンスを利用する基本的なサンプルプログラム

ここで作るアプリケーションは次のような動作をします。

起動すると、次のような画面が表示されます。

Android Prefence

上から順にテキストの入力ボックス (EditText)、Write (書込み) ボタン、Read (読込み) ボタン、そして、この時点ではみえていませんが、読み込んだ値を表示する TextView。

使い方は、まず EditText に何か文字を入力して、Write ボタンを押します。すると、プリファレンスの data1 というキーの値として、 入力した文字が設定されます。

Android Prefence

Read ボタンを押すと、プリファレンスの data1 というキーに対する値が読み込まれ、TextView に表示されます。

Android Prefence

MENU ボタンを押すと、オプションメニューが表示されます。ここでは "Settings..." という項目だけです。

Android Prefence

"Settings..." を選択するとプリファレンスの設定画面が表示されます。

Android Prefence

Data 1 という項目を選ぶと Data 1 の設定画面が表示されます。

Android Prefence

ここには確かにメインスクリーン (アクティビティ) で設定した値がセットされていることが分かります。

ここで文字を変更して・・・

Android Prefence

OK を押した後、BACK キーで元のメインアクティビティに戻ります。ここで Read ボタンを押すと、オプションメニューから表示した、 プリファレンスの設定画面で設定した値が確かに取得出来ることがわかります。

Android Prefence

こうしたプログラムをどのように実装するのか見ていきましょう。

シェアド・プリファレンスとは

実装方法を見る前に、もう少しプリファレンスの詳細を説明します。

ここで言っているプリファレンスは、シェアド・プリファレンス (共有プリファレンス, Shared Preferences) というものです。

"/data/data/パッケージ名/shared_prefs" ディレクトリに XML ファイルが作成され、そこにキーと値のペアとしてデータが保存されます。

シェアドプリファレンスへアクセスするモードは次のモードがあります。

  • MODE_PRIVATE - 呼び出したアプリケーションだけが XML ファイルにアクセス可能
  • MODE_WORLD_READABLE - 全てのアプリケーションが XML の読み込み可能
  • MODE_WORLD_WRITEABLE - 全てのアプリケーションが XML への書き込み可能

プリファレンスの読み込みと書き込み

まずメインアクティビティの Read ボタン、Write ボタンで行っている、プリファレンスの書き込みと読み込みをみてみましょう。

package com.keicode.android.test;

import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class PrefTest1Activity extends Activity {
  
  SharedPreferences sharedPref;
  
  TextView readTextView;
  EditText writeEditText;
  Button readButton;
  Button writeButton;
  
    @Override
    public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);
      findViews();
      setListeners();
      
      sharedPref = 
        PreferenceManager.getDefaultSharedPreferences(this);
    }
        
    @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    super.onCreateOptionsMenu(menu);
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.optionsmenu, menu);
    return true;
  }

  @Override
  public boolean onOptionsItemSelected(MenuItem item) {
    switch(item.getItemId()){
    case R.id.settings:
      startActivity(new Intent(this, MyPreferences.class));
      return true;
    }
    return false;
  }

  protected void findViews(){
      readTextView = (TextView)findViewById(R.id.textView1);
      writeEditText = (EditText)findViewById(R.id.editText1);
      readButton = (Button)findViewById(R.id.readButton);
      writeButton = (Button)findViewById(R.id.writeButton);
    }
    
    protected void setListeners(){
      readButton.setOnClickListener(new OnClickListener(){
      @Override
      public void onClick(View v) {
        readTextView.setText(
          sharedPref.getString("data1", ""));
      }
      });
      
      writeButton.setOnClickListener(new OnClickListener(){
        @Override
        public void onClick(View v){
          Editor editor = sharedPref.edit();
          editor.putString(
            "data1", writeEditText.getText().toString());
          editor.commit();
        }
      });
    }
}

PreferenceManager の getDefaultSharedPreferences メソッドで SharedPreferences オブジェクトを取得して保持しておきます。

値を設定する時はそこから Editor を取得して書き込み、コミット。読み込むときは getString メソッドで名前を指定して値を取得しています。

プリファレンスアクティビティの表示

プリファレンスを簡単に設定するために、PreferenceActivity から派生して作る設定画面を利用できます。

PreferenceActivity ではプリファレンスリソースを定義しておくだけで、設定画面を自動的に作ってくれます。

res/xml フォルダ以下に XML ファイルを作って、プリファレンスを定義します。ここでは preferences.xml という名前にしました。

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen 
  xmlns:android="http://schemas.android.com/apk/res/android">
	<EditTextPreference 
		android:title="Data 1"
		android:key="data1"
		android:summary="This is data1."/>
</PreferenceScreen>

res/xml/preferences.xml を作った上で、つぎのように addPreferencesFromResource メソッドを呼び出します。

package com.keicode.android.test;

import android.preference.PreferenceActivity;
import android.os.Bundle;

public class MyPreferences extends PreferenceActivity {

	@Override
	public void onCreate(Bundle savedInstanceState) {
	    super.onCreate(savedInstanceState);
	    addPreferencesFromResource(R.xml.preferences);
	}

}

ちなみに、これはアクティビティですから AndroidManifest.xml にも登録するのをお忘れ無く。

オプションメニューなど、その他について・・・

オプションメニュー

オプションメニューについては、説明は メニューリソースを用いたオプションメニュー を見ていただくことにして、 ここでは必要なファイルとその内容を示しておきます。

オプションメニューのためのリソースファイルは res/menu/optionsmenu.xml として、次のとおり。

<?xml version="1.0" encoding="utf-8"?>
<menu 
  xmlns:android="http://schemas.android.com/apk/res/android">
	<item 
		android:id="@+id/settings"
		android:title="Settings..."/>
</menu>

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Android 開発入門