SyntaxHighlighter

2012年2月13日月曜日

Action Bar実装編(前回の続き)

前回の続きです。

メニュー用のリソースも出来ましたので、メニュー表示をプログラムに実装して使えるようにしましょう。

と言っても今回はいろいろ工夫したりしているわけではないので、Android Developersの「Menus」にあるようなリファレンスどおりの作り方になりますが(^^ゞ

onCreateOptionsMenu()はこんな感じ。

@Override
public boolean onCreateOptionsMenu(Menu menu) {
 MenuInflater inflater = getMenuInflater();
 inflater.inflate(R.menu.menu_main, menu);
 return true;
}

ちょこっと解説。
MenuInflater でXMLからメニューの情報を使用します。
で、nflater.inflate()で、作成したmenu_main.xmlをIDで指定します。

次に、メニューが選択された時の動作、onOptionsItemSelected()はこんな感じです。
@Override
public boolean onOptionsItemSelected(MenuItem item) {
 switch( item.getItemId() ) {
  case R.id.appfinish:
   finish();
   break;
  case R.id.howto:
   showHelp();
   break;
  case R.id.about:
   showCredit();
   break;
 }
 return super.onOptionsItemSelected(item);
}

こちらは簡単ですね。
switch 文を使って、 受け取った MenuItem の getItemId()で選択されたメニューアイテムのIDを取得して、caseで各IDを指定します。
IDはmenu_main.xmlで各メニューアイテムに指定したIDを利用します。

これでAndroid3.0以上の環境で実行すると Action Bar として実行され、Android 3.0以前では従来のようなメニューで表示されます。

Action Barでの表示方法は前回書きました、show As Action の指定の方法で変わってきます。実際に設定して動かしてみると違いがよくわかると思います。

最後に、アプリのバージョンアップです。

マニフェストファイルの Version Codeを前回よりも大きい数字(今回の私の場合、1 → 2)に変更して、Version Nameも任意の値を指定(今回は1.0.0 → 1.1.0)、アップロード用の apk ファイルを作成したらAndroidマーケットのデベロッパーコンソールでアップロード済みのアプリを選択し、「APKファイル」タブを選択して、新規のAPKファイルをアップロード。アップロードが完了したら新しい方のパッケージを有効にして、必要に応じて「商品の詳細」タブでRecent Changes(更新情報)を記入して、「保存」をクリック。

すぐ見ても反映されませんでしたが、一晩たった時点では反映されていました(最短どのくらいかは…あとで調べてみようと思います)。
ちなみに、更新情報に

あああ
いいい

というように書いたらそのまま出るのかと思ったら、
  1. あああ
  2. いいい
というように、各行が番号付きで表示されるようでした。

2012年2月12日日曜日

今までのメニュー表示からActionBarを利用したメニュー表示に変更

前回のエントリーでAction Barを使ってみようということで軽く調べてから、Androidマーケットにアップしている「シンプル電卓」を改良して、ついでにバージョンアップのテストもやってみようかという企画(?)です。

一般的なMenuの作り方は
private static final int MENU1_ID = Menu.FIRST;
private static final int MENU2_ID = Menu.FIRST + 1;
pivate static final int MENU3_ID = Menu.FIRST + 2;
というような感じで、Menu用のIDを作って、
@Override
public boolean onCreateOptionsMenu(Menu menu) {
 boolean result = super.onCreateOptionsMenu(menu);
 // メニューアイテムを追加する
 menu.add(0, MENU1_ID, Menu.NONE, R.string.menu1Label).setIcon(R.drawable.ic_menu_close_clear_cancel);
 menu.add(0, MENU2_ID, Menu.NONE, R.string.menu2Label).setIcon(R.drawable.ic_menu_info_details);
 menu.add(0, MENU3_ID, Menu.NONE, R.string.label_about).setIcon(R.drawable.ic_menu_notifications);
 return result;
}
と、onCreateOptionsMenu()でMenuボタンを押した時に表示されるメニューを作成し、
@Override
public boolean onOptionsItemSelected(MenuItem item) {
 switch( item.getItemId() ) {
  case MENU1_ID:
   finish();
   break;
  case MENU2_ID:
   showHelp();
   break;
  case MENU3_ID:
   showCredit();
   break;
 }
 return super.onOptionsItemSelected(item);
}
てな感じで、onOptionsItemSelected()でメニューが選択された時の動作を決定するわけです。

これを、Action Barを使用した作りにします。
まずは、作成しているアプリのmin SDK VersionとTarget SDK Versionを決定します。
Action Barが使えるようになったのはAndroid 3.0(Level 11)からなので、Target SDK Versionは11以上に設定しましょう。min SDK Versionは自分のアプリの最低条件をつけてやりましょう(私の場合はAndroid 1.6なので4です。)。

次に「project.properties」にあるTarget SDKにも先ほど設定したTarget SDK Versionと同じ数字を「Android-xx」の「xx」につけましょう。そして、eclipse再起動。私の場合、eclipse再起動で後ほど設定するshow As Actionが有効になってくれました。

下準備が整いましたので続いて、menu用のリソースを/res/menuの下に作ります(resの下のmenuフォルダはresを右クリックして[新規]-[フォルダー]です(eclipseの場合))。
「Android XML File」を新規作成し、Resource Typeに「Menu」を設定、ファイル名を入力して(ここでは menu_main)完了。
こんな感じの画面になります(Itemなどすでに追加済みですが…)
res/menuのxml編集画面
 xmlを直接記述でもいいですが、ここはGUIで操作をしましょう。
はじめは Menu Elements には何もありませんので、Add ボタンをクリックして、「Group」か「Item」を選択してOKを押します。
すると、Menu Elements に一つデータが追加されました。
後はそのアイテムのIDやTitle、Iconを設定します。
次に、ようやくここで show As Action の設定です。
show As Actionの右側の Select ボタンを押すと
  • never … Action Barには表示されない
  • ifRoom … Action Barにスペースがあれば表示する
  • always … 必ずAction Barに表示する
  • withText … Action BarにIconと共にテキストを表示する(Land Scape時のみ?)
  • collapseActionView … action viewを関連付けることで折り畳めるメニューを表示(Level 14から)
の選択肢が表示されます。
collapseActionViewですが、エミュレータで確認した限りでは、WVGA800では通常のMenuと同様にポップアップ表示、WXGA720ではひとまとめになって表示されました。
collapseActionView
なので、「ある程度の解像度から」と書きました。が、間違っていればご指摘をお願いいたします(他に設定すればWVGA800でもひとまとめ表示になるよ、など)。
※訂正:Nagoya0さんからのコメントにありますとおり、collapseActionViewを指定したために通常表示やまとまった表示になっていたのではなく、action viewを指定していないためにデフォルトの動作になっていただけのようです。
collapseActionViewを使用する場合はandroid.widget.SearchViewのようなaction viewと関連付けて使用することで伸縮するメニューを利用することができるようです。
SearchView を使った例。上が閉じた状態、下が展開した状態


と、とりあえず、今回はここまで。次回は続きとAndroidアプリのバージョンアップについて書きたいと思います。

次回:Action Bar実装編

2012年2月6日月曜日

ActionBarを使ってみようかと…

android developers blogの「Say Goodbye to the Menu Button」でActionBarを使おうって言ってるので、とりあえず軽く触ってみて、ついでに、テストアップしたアプリもActionBar対応にしようかと思ったのですが…

Dev GuideのAction Barのページ(こちら)を参照しながら作ってみると、res/menuのmenu.xmlで「android:showAsAction」を使おうとするとエラーでアプリがビルドできず。

さてどうしたもんかと、Menu Resource(こちら)のページを見てみると「Introduced in API Level 11.」という記載が。

Min SDK : 4、Target SDK : 14でやっていたのを両方11にしたら動くようになりましたが、はて、11以外では動かないのかな?
それともサボってソースとその周辺だけ読んでいるせいでなんか見逃してるのかな?
ちなみに、Min SDK:11だけでTarget SDKをなしにしてもダメでした。

もうちょっと調べてみよう。

追記:
調べた結果、というか動かしているうちにMin SDK : 4、Target SDK : 14でも動くようになったので、更に見てみると「project.properties」のtarget-SDKも「android-14」にすることと、eclipseを再起動することで使えるようになりました。
res/menu/menu.xmlを編集する際にGUI編集画面に「show as action」の入力欄が出ていない時はビルド出来ず、表示されるようになればビルドできるようになりました。

あ、調べるついでに、Androidのマスコットの名前を再調査しました。
以前調べた時には、もうなくなったページの配布画像の下に「droid : jpeg」とあったので、droidかなぁ、と思っていました(droidもロボットの意味でしょうけど)が、実際は「公式の名前はない」ということらしいです(こちらを参照)。Brand Guidelinesでも「Android Robot」ってしか書いてないですしね。
他に、Googleの中の人たちはマイクと読んでいたり、犬のマスコットをアレックスと読んでいたり。
まあそれでも、今後も言いやすいので「ドロイドくん」 と呼ぼうと思いますが。

ちなみに、WikipediaのAndroidを見ると「正式名称はGoodies」と書いてありますが、もうなくなった「http://www.android.com/media/goodies.html」というページ(こちらの記事でスクリーンショットが見れました)に画像やらフラッシュバナーがあったのですが、このページのファイル名「goodies」やサムネイルの上の「Goodies」を名前と勘違いしたんだと思います。Goodiesは「グッズ」っていう意味でしょうからね。