このページの本文へ

これで作れる! Androidのアプリケーション 第7回

Androidアプリの設定画面を作成する

2010年08月12日 18時00分更新

文● 塩田紳二

  • この記事をはてなブックマークに追加
  • 本文印刷

実際に画面を見ながらxmlを作成する

 このSample06を起動し、ボタンを押すと、下の左画面ような設定画面が表示されます。

 「Next Page」の部分をタップすると下の右画面に切り替わります。

sample06で、設定画面を起動したところ。最初の4つは基本の設定用パーツであり、次のところはPreferenceパーツを指定して別途作成したView(Layout)を指定したもの。NextPageをクリックすると次の画面に切り替わる

Next pageをクリックして別の設定画面に切り替わったところ。項目の多い設定項目をこのような形で複数のページに分けることもできる。この程度までの設定画面であれば、ほとんどコードを書くことなくxmlだけで作成が可能

 このページでは、設定用パーツ間に依存関係を付けてあり、2つ目のEditTExtは、上にあるチェックボックスがオンのときにしか有効になりません。また、xmlファイル自体を以下に示します。

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:title="Sample06 Preference Activity">
  <PreferenceCategory android:title="1st Category">
    <CheckBoxPreference
      android:summaryOn="CheckBox is on"
      android:summaryOff="CheckBox is off"
      android:title="CheckBoxPreference"
      android:summary="Sample of Check Box"
      android:defaultValue="true"
       android:key="@string/prefs1CB">
    </CheckBoxPreference>
    <EditTextPreference
      android:defaultValue="string value"
      android:dialogMessage="This is demo EditTextPrefs"
      android:key="@string/prefs1TE"
      android:summary="Summary for EditText Demo"
      android:dialogTitle="Dialog Title for EditTextDemo"
      android:title="Title for EditText">
    </EditTextPreference>
    <ListPreference
      android:entryValues="@array/EntryValue"
      android:summary="This is Summary for ListPrefs"
      android:entries="@array/Entry"
      android:dialogTitle="ListPrefs Demo"
      android:title="ListPrefs" android:key="@string/prefs1LP"
      android:selectable="true" android:enabled="true"
      android:positiveButtonText="OHK"
      android:negativeButtonText="Kancel"
      android:defaultValue="2nd">
    </ListPreference>
    <RingtonePreference
      android:showSilent="true"
      android:title="Title for RingTonePrefs"
      android:ringtoneType="ringtone"
      android:showDefault="true"
      android:summary="Summary for RingTonePrefs"
      android:key="@string/prefs1RT">
    </RingtonePreference>
  </PreferenceCategory>
  <PreferenceCategory android:title="Preference with Layout">
    <Preference
      android:summary="Summary for Preference"
      android:title="Title for Preference"
      android:key="@string/prefs1PP"
      android:layout="@layout/prefs_sample">
    </Preference>
  </PreferenceCategory>
  <PreferenceCategory android:title="2nd Category">
    <PreferenceScreen android:title="Next Page"
      android:summary="Summary for PrefsScreen">
      <PreferenceCategory android:title="Category2">
        <CheckBoxPreference android:key="@string/prefs2CB"
          android:title="Title for 2nd CheckBox"
          android:summary="Summary for 2nd CheckBox"
          android:summaryOn="2nd CheckBox is on"
          android:summaryOff="2nd CheckBox is off"
          android:disableDependentsState="false">
        </CheckBoxPreference>
        <EditTextPreference android:key="@string/prefs2ET"
          android:dependency="@string/prefs2CB"
          android:summary="Summary for 2nd EditText"
          android:title="Title for 2nd EditText">
        </EditTextPreference>
      </PreferenceCategory>
    </PreferenceScreen>
  </PreferenceCategory>
  <PreferenceCategory android:title="3rd Category">
    <CheckBoxPreference
      android:title="Title for Category 3 CheckBox"
      android:summary="Summary for CheckBox3"
      android:key="@string/prefs3CB">
    </CheckBoxPreference>
  </PreferenceCategory>
</PreferenceScreen>

 ここで、xmlを使って設定画面を構成する場合の注意をいくつか述べておきましょう。まず各設定パーツには、「key」というアトリビュートがあります。これは、パーツに対応する設定値をアクセスするときに使うキーです。このため、他のクラス内からアクセス可能なように文字列値として定義しておくと便利です。このとき、文字列値はstring.xmlではなく、ids.xml(IDを定義するファイル)で行なうようにします。

 というのは、string.xmlは、多国語化するときに使われるため、画面上に表示されるようなメッセージ用としておき、このキーのように内部的に使われる文字列値は、IDとして管理しておくほうが便利なのです。

 文字列値なので、ここでは名前とまったく同じものを値として定義しています。プレファレンスエディタでは「structure」タブで各パーツの名前としてこの「キー」が使われます。ここにids.xmlで定義した文字列値を使うということはリスト中での名前は、すべて「@string/xxxxx」という形式になります。xxxxxには、ids.xmlで定義した名前(Name)が使われるので、名前と値(Value)を一致させておいたほうが間違いが少なく、またデバッグ時に値を見るときに一致していたほうがわかりやすくなります。

 もうひとつ、ListPreferenceをxmlで定義するとき、リストに項目として表示される文字列と、値となる文字列を配列として定義します。このとき、配列自体はarrays.xmlで定義できますが、表示に使う配列(Entry)に直接文字列を書き込んでしまうと、うまく動作しないことがあります。具体的にはスペースが入るとうまく動きません。この部分は国際化する可能性が高いため、表示する文字列は、strings.xmlで定義しておき、表示用配列の各要素は、文字列リソースを「@sting/yyyyy」という形で参照するようにします。このやり方だと、表示用文字列にスペースが入っていてもちゃんと表示されます。表示文字列をstring.xml側で定義しているので、国際語化したときにもarrays.xmlには手を加える必要がありません。

 なお、このようにして作成したListPreferenceでは、表示用の選択肢には、Entriesで指定した文字列配列が使われ、値として保存されるのは、Entry valuesに指定された文字列配列の同じインデックス値を持つ要素が使われます。

カテゴリートップへ

この連載の記事

注目ニュース

ASCII倶楽部

プレミアムPC試用レポート

ピックアップ

ASCII.jp RSS2.0 配信中

ASCII.jpメール デジタルMac/iPodマガジン