コンピュータクワガタ

かっぱのかっぱによるコンピュータ関連のサイトです

Androidアプリ入門 No.43 PreferencesActivityの基本

PreferencesActivity

PreferencesActivityの基本

AndroidのOS自体の設定画面のようなものは、ある一定以上のアプリケーションの場合には必要になることが多い。自分で同様の画面を作成しようとすると多少大変であるが、AndroidではPreferencesActivityというものがあり、簡単に設定画面を作成することができる。
設定画面を最初に作成する。設定画面を作成するには、res/xml/preferences.xmlファイルを用意し、以下のようにする。

<PreferenceScreen
        xmlns:android="http://schemas.android.com/apk/res/android">
    <CheckBoxPreference
        android:key="check"
        android:title="チェックボックス"
        android:summary="チェックすると状態が変わります" />
</PreferenceScreen>

Preference共通の属性値として以下の3つがある。

属性 内容
key 設定のキー。設定ファイルに保存される際にこのキーで保管される。
title 画面に表示するタイトル。
summary 画面に表示する概要。

次に、このxmlファイルを元にして設定画面を作成する。sample.at.ConfActivity.javaファイルを以下のように作成する。重要なのは、PreferenceActivityクラスを継承し、addPreferencesFromResourceで、上記のpreferences.xmlファイルを読み込む。

package sample.at;

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

public class ConfActivity extends PreferenceActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        addPreferencesFromResource(R.xml.preferences);
    }
}

次に、このActivityを呼び出すためのMainActivityを用意する。まずは、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"
    >
    <Button
        android:id="@+id/button"
        android:text="設定"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />
</LinearLayout>

MainActivity.javaは以下のようになる。MainActivityでは、「設定」ボタンを押されたときに、ConfActivityが開くようになっている。Intentというものを使用しているが詳しくは後述する。

package sample.at;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                startActivity(new Intent(getApplicationContext(), ConfActivity.class));
            }
        });
    }
}

ここまでで、設定画面が呼び出せそうだが呼び出せない。Activityはmanifestファイルに定義されたものしか呼び出せないようになっている。そこで、AndroidManifest.xmlファイルを以下のように定義する。追加したのは、ConfActivityの部分だけである。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="sample.at"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".MainActivity"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".ConfActivity"
                  android:label="設定">
        </activity>
    </application>
    <uses-sdk android:minSdkVersion="4" />
</manifest>

実行し、「設定」ボタンを押すと以下のような画面になる。

設定画面では、チェックボックスが表示される。このチェックボックスは特に保存等の処理を実装しなくても、状態の変更がされた段階でデータが保管される。
実際に、エミュレーターのFile Explorerから/data/data/sample.at/shared_prefs/sample.at_preferences.xmlを確認すると、以下のように設定が保管されているのが確認できる。

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<boolean name="check" value="false" />
</map>