飴屋

Androidアプリ/日記13

OracleとGoogle

私は長い間Java言語から離れていたので詳しい経緯はわからないのですが、Androidのソースの中にJavaのソースのコピーがみつかったというニュースがちょっとした騒ぎになっているようです。JavaはSunの製品でしたが、SunがOracleに買収されてそのコントロール権はOracleに委譲されました。GoogleはSunとの間でライセンシーの処理がうまくいかず、AndroidにはではJavaと似て非なる製品を搭載しています。(Dalvik VMとかいう)この似て非なる製品に対して、OracleがJavaの不正な利用にあたるとして提訴していた最中、似て非なる製品の中にそっくりコピーされたと思しきソースが発見されたというのが、今回のニュースの概要のようです。

開発者としてライセンスの問題には敏感にならないといけないのですが、ライセンスの形態もたくさんでてきてややこしいですね。今回のことでただちにAndroid製品の出荷が差し止められるということもないのですが、少し気に留めておきたいことではあります。

Oracleの持つ製品で業務によく使うのはMySQLだったりします。MySQLの未来がOracleに握られていると思うと、あまりいい想像が思い浮かびませんね。Oracle社の収益方針から鑑みて、これまでのMySQLユーザ向けの新しいソリューションは提示されるでしょうか?

設定画面を作る

今回はアプリ全体に渡って使われる「設定」を決めるActivityを作成しようと思います。Androidアプリは複数のActivityで構成されることが多いので、一つの設定を複数のActivityで共通して利用できる仕組みが用意されています。これがSharedPreferenceと呼ばれる仕組みですね。Windowsアプリ開発ではINIファイルとかレジストリとかに近い仕組みでしょうか。SharedPreferenceの正体はXMLファイルだそうです。なので、適切なパーミッションを設定することで、アプリの設定を他のアプリと共有したり、アプリの設定を秘匿したりできるようです。

今回は設定画面の作成を通して、そんなSharedPreferenceの使い方を説明しようと思っていたのですが、面倒な処理は勝手に行ってくれる設定画面用のActivityが既に定義されているそうなので、そちらを使ってみることにします。

PreferenceActivity

PreferenceActivityは、Activityクラスを継承した設定画面用のクラスです。いろいろなアプリの設定画面でも使われているので、このクラスを使っておくとユーザにとってなじみの画面レイアウトになると思います。

public class UtilWeight extends PreferenceActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.util);
}
}

このアプリではUtilWeightという名前のアクティビティを設定画面としました。
onCreateメソッド内で、addPreferencesFromResourceを呼び出すだけで簡単に設定画面ができあがりました。設定画面の項目等の定義は別途XMLファイルを用意しています。R.xml.utilの実体はres/xml/util.xmlで定義しました。

設定項目の定義

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<ListPreference android:summary="@string/summaryWeightUnit" android:title="@string/titleWeightUnit"
android:dialogTitle="@string/titleWeightUnit" android:key="weightUnit"
android:entries="@array/listUnitKey" android:entryValues="@array/listUnitValue" android:defaultValue="1"></ListPreference>
<PreferenceCategory android:title="@string/titleCategoryTwitter" android:key="categoryTwitter">
<CheckBoxPreference android:key="canTwitter" android:title="@string/titleCanTwitter"
android:summary="@string/summaryCanTwitter"></CheckBoxPreference>
<EditTextPreference android:title="@string/titleTweetFormat" android:summary="@string/summaryTweetFormat"
android:dialogMessage="@string/summaryTweetFormat" android:dialogTitle="@string/titleTweetFormat"
android:key="twitFormat" android:dependency="canTwitter"
android:defaultValue="@string/defaultTweet"></EditTextPreference>
</PreferenceCategory>
<PreferenceCategory android:title="@string/titleCategoryDatabase" android:key="categoryDatabase">
<PreferenceScreen android:key="importDatabase" android:title="@string/titleImportDatabase"
android:summary="@string/summaryImportDatabase"></PreferenceScreen>
<PreferenceScreen android:key="exportDatabase" android:title="@string/titleExportDatabase"
android:summary="@string/summaryExportDatabase"></PreferenceScreen>
<PreferenceScreen android:key="clearDatabase" android:title="@string/titleClearDatabase"
android:summary="@string/summaryClearDatabase"></PreferenceScreen>
</PreferenceCategory>
</PreferenceScreen>

設定画面を定義するXMLファイルを上のようにしました。どんな要素があるか整理してみましょう。

PreferenceScreen
設定項目を含むリストを定義します。入れ子にすると子供をタップして、子供のリストを表示させることができるようです。
PreferenceCategory
設定項目の分類を定義します。分類の見出しをつけて項目の視認性が上がります。
CheckBoxPreference
チェックボックスを定義します。
EditTextPreference
テキスト入力ボックスを定義します。
ListPreference
選択肢から項目を選択するリストボックスを定義します。

各要素の属性もいろいろありますが、共通して使われるものを眺めてみます。

android:key
設定項目を表す一意の文字列。この文字列を使って設定された値を後から参照します。
android:title
設定項目の見出し。
android:summary
設定項目の概要。
android:defaultValue
設定項目の初期値。
android:dialogTitle
設定用のダイアログの見出し。
android:dialogMessage
設定用ダイアログのメッセージ。

ここではこんな属性も使っています。

android:dependency
指定した設定項目への依存を定義します。今回は「canTwitter」がチェックされているかどうかに依存して、「twitFormat」のにゅうりょく可否が決定されるように定義されています。
android:entries
ListPreferenceの選択肢を定義する。
android:entryValues
ListPreferenceの各選択肢の値を定義する。

これらを利用して、以下のような設定が行えるようになっています。

  • 体重の単位の選択
  • 計測内容をTwitterに投稿するかどうかを設定
  • 計測内容をTwitterに投稿する際の文言のフォーマット変更
  • データのCSVファイルからのインポート
  • データのCSVファイルへのエクスポート
  • 全てのデータの削除

もちろんこれは見かけだけの定義なので、実装はまた別に行わないとです。しかし、これだけの作業で設定画面ができるのは簡単でいいですね。XMLファイルで定義されているので、メンテナンス性も優れていそうです。

後で気がついたのですが、ListPreference要素にandroid:dialogMessage属性を設定したら選択肢が表示されませんでした。理由はわかりませんが、属性を消したら問題が解消しました。

日記一覧