Androidアプリ/日記10
Androidアプリの本
Android端末の普及とともに、本屋さんの棚のiPhone開発関連書籍の隅のAndroid開発関連書籍が増えてきたような気がします。パラパラとめくってみても、どれを買って勉強すればいいのかわからないので何も買わずに店をあとにすることが多いですが、何か定番本みたいなものってあるのでしょうか?
私は一冊Androidに関する書籍を持っているのですが、海外の書籍が日本語訳されたものなので情報が古いようです。他人の作ったアプリを眺めて、「こんな機能がAndroidにあるのか!?」と気づいて、本で調べてみても関連する情報が載っていないこともありました。Androidはアップデートも盛んなので、最新の情報を抑えるチャンネルの必要性を感じました。
それとは別に、人に配布するアプリを作るにあたって、バージョンの若いOS対応や端末間の差異を吸収できるような情報源も必要だと思いました。
現在、何かよいリソースがないか探しています。
メニューを表示してみよう
さて、前回やっと入力した体重の数値をSQLiteに保存することができました。次は保存したデータを使ってグラフを描画したい・・・と思っていたのですが、数値入力用のActivityからグラフ描画用のActivityに遷移する手段がありませんので、そちらを先に用意しなくてはなりません。
方針としては、体重の入力後、すぐにグラフを表示する必要を今のところ感じないので、OptionsMenuというやつを使って画面を遷移しようと思います。OptionsMenuというのは、メニューボタン(私の端末だと「menu」って刻印されているボタン)を押すと画面の下の方からピョコンと出てくる選択肢のことです。選択肢をタップすることでいろいろなアクションを発動できるので、グラフ表示Activityを表示するためのボタンを作りたいと思います。余談ですが、OptionsMenuが画面の下からピョコンとでないような端末があるのかないのかちゃんと調べてません。バージョンが若い端末だとでないかもしれないし、UIがカスタマイズされていて、見せ方が異なるAndroidもあるかもしれませんね。
メニューの表示項目
OptionsMenuを面倒くさいのでメニュー呼びます。そして、メニューの中の選択肢をアイテムと呼ぶことにします。
アイテムに設定できる項目がいくつかあって、代表的なところでは以下のものがあるようです。
- ID
- タイトル
- アイコン画像
- ショートカットキー
これらの項目はコード上でも設定できるようですが、リソースとしてXMLでも定義できるらしいので今回はXMLのリソースを作って、それを読み込む形にしてみたいと思います。
アイテムはグループ化することもできるそうなので、関連する項目のグルーピングによって使い勝手の向上も見込めそうです。今回は画面遷移を行うだけなので、グループ分けは特にしません。
メニューを作成するタイミング
Activityの中で表示するメニューの設定を行うタイミングは二通りあるそうです。Activityを継承したクラスの中で以下のメソッドを上書きして、その中で設定することになるそうです。
onCreateOptionsMenu
Activityが開始されたタイミングで呼び出されるメソッドです。メニューの中身が固定であれば、このタイミングで一度設定しておけばよさそうです。
onPrepareOptionsMenu
メニューボタンが押されたタイミングで呼び出されるメソッドです。Activityの状態に応じて動的にメニューの内容を変更したい場合は、このタイミングでメニューを更新できます。
メニュー定義XML
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/menu_input_tograph" android:numericShortcut="1" android:title="@string/tograph"
android:titleCondensed="@string/graph"></item>
<item android:id="@+id/menu_input_toutil" android:numericShortcut="2" android:title="@string/toutil"
android:titleCondensed="@string/util" android:icon="@android:drawable/ic_menu_preferences"></item>
</menu>
実際に体重入力Activityのメニューを上記のようにres/menu/input.xmlという名前で定義してみました。
menuというノードがメニューを表して、アイテムを表すitemというノードを2つ抱合しています。itemノードのアトリビュートを解説しましょう。
- android:id
- アイテムのID
- android:numericShortcut
- 数字のショートカットキー(別途英字のショートカットキーも設定できるようです)
- android:title
- アイテムの見出し。@string/tographは文字列リソースを参照しています。values-jp/string.xmlでは、「グラフ表示」と定義してあります。
- android:titleCondensed
- アイテムの見出しの省略表現。@string/graphでは、「グラフ」を示す文字列リソースを参照しています。
- android:icon
- アイコン。二つ目のアイテムにはAndroid標準のアイコンでピッタリのがあったので、そちらの画像リソースを参照するようにしています。
メニューXMLを読み込む
@Override
public boolean onCreateOptionsMenu(android.view.Menu menu) {
super.onCreateOptionsMenu(menu);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.input, menu);
return true;
}
onCreateOptionsMenuメソッドへは、そのActivityのメニューを表すインスタンスが引数で渡されるようなので、MenuInflaterを使ってXMLの内容をそこに反映してあげます。
MenuInflaterはメニューの中身を操作するためのクラスですかね。getMenuInflaterメソッドを使うと、このActivityのメニューを操作するためのMenuInflaterインスタンスが取得できます。
MenuInflater.inflateの引数にメニュー定義XMLの所在と、操作対象のMenuオブジェクトを指定するだけでOKでした。
別のアクティビティを呼び出す
@Override
public boolean onOptionsItemSelected(MenuItem item) {
Intent intent = null;
switch (item.getItemId()) {
case R.id.menu_input_tograph:
intent = new Intent(InputWeight.this,GraphWeight.class);
startActivity(intent);
break;
case R.id.menu_input_toutil:
intent = new Intent(InputWeight.this,UtilWeight.class);
startActivity(intent);
break;
}
return true;
}
メニューがタップされたときには、onOptionsItemSelectedメソッドが呼び出されます。タップされたアイテム(MenuItem)が引数にわたってくるので、アイテムのIDをgetItemIdで取得してどのアイテムがタップされたかを判別します。
先にXMLで「グラフ表示」と定義したアイテムがタップされると、グラフ表示用のアクティビティ(GraphWeight)を呼び出します。新しいアクティビティはstartActivityメソッドにIntentを指定すると呼び出せます。Intentは「何がしたいか」を表すクラスでしたね。今回は「特定のActivityを呼び出したい」ので対象Activityを明示的に指定しています。
これで入力画面からグラフ画面、設定画面への遷移ができるようになりました。遷移先の画面から戻ってくる入力画面に戻ってくる方法も作っておかないとですね〜。